module Halogen.Query.HalogenQ where

import Data.Functor.Coyoneda
import HPrelude

data HalogenQ query msg input a
  = Initialize a
  | Finalize a
  | Receive input a
  | Action msg a
  | Query (Coyoneda query a) (() -> a)
  deriving ((forall a b.
 (a -> b)
 -> HalogenQ query msg input a -> HalogenQ query msg input b)
-> (forall a b.
    a -> HalogenQ query msg input b -> HalogenQ query msg input a)
-> Functor (HalogenQ query msg input)
forall a b.
a -> HalogenQ query msg input b -> HalogenQ query msg input a
forall a b.
(a -> b)
-> HalogenQ query msg input a -> HalogenQ query msg input b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (query :: * -> *) msg input a b.
a -> HalogenQ query msg input b -> HalogenQ query msg input a
forall (query :: * -> *) msg input a b.
(a -> b)
-> HalogenQ query msg input a -> HalogenQ query msg input b
$cfmap :: forall (query :: * -> *) msg input a b.
(a -> b)
-> HalogenQ query msg input a -> HalogenQ query msg input b
fmap :: forall a b.
(a -> b)
-> HalogenQ query msg input a -> HalogenQ query msg input b
$c<$ :: forall (query :: * -> *) msg input a b.
a -> HalogenQ query msg input b -> HalogenQ query msg input a
<$ :: forall a b.
a -> HalogenQ query msg input b -> HalogenQ query msg input a
Functor)

instance Bifunctor (HalogenQ query msg) where
  bimap :: forall a b c d.
(a -> b)
-> (c -> d) -> HalogenQ query msg a c -> HalogenQ query msg b d
bimap a -> b
f c -> d
g = \case
    Initialize c
a -> d -> HalogenQ query msg b d
forall (query :: * -> *) msg input a.
a -> HalogenQ query msg input a
Initialize (c -> d
g c
a)
    Finalize c
a -> d -> HalogenQ query msg b d
forall (query :: * -> *) msg input a.
a -> HalogenQ query msg input a
Finalize (c -> d
g c
a)
    Receive a
i c
a -> b -> d -> HalogenQ query msg b d
forall (query :: * -> *) msg input a.
input -> a -> HalogenQ query msg input a
Receive (a -> b
f a
i) (c -> d
g c
a)
    Action msg
msg c
a -> msg -> d -> HalogenQ query msg b d
forall (query :: * -> *) msg input a.
msg -> a -> HalogenQ query msg input a
Action msg
msg (c -> d
g c
a)
    Query Coyoneda query c
y () -> c
g' -> Coyoneda query d -> (() -> d) -> HalogenQ query msg b d
forall (query :: * -> *) msg input a.
Coyoneda query a -> (() -> a) -> HalogenQ query msg input a
Query ((c -> d) -> Coyoneda query c -> Coyoneda query d
forall a b. (a -> b) -> Coyoneda query a -> Coyoneda query b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
g Coyoneda query c
y) (c -> d
g (c -> d) -> (() -> c) -> () -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> c
g')