module Data.Extensible.Union (
(<$?~)
, Union(..)
, liftU
, Flux(..)
, mapFlux
) where
import Data.Typeable
import Data.Extensible.Internal
import Data.Extensible.Sum
import Data.Extensible.Product
import Data.Extensible.Match
newtype Union fs a = Union { getUnion :: Flux a :| fs } deriving Typeable
instance Functor (Union fs) where
fmap f (Union (UnionAt pos s)) = Union (UnionAt pos (mapFlux f s))
liftU :: (f ∈ fs) => f a -> Union fs a
liftU = Union . embed . Flux id
data Flux a f where
Flux :: (a -> b) -> f a -> Flux b f
mapFlux :: (a -> b) -> Flux a f -> Flux b f
mapFlux f (Flux g m) = Flux (f . g) m
(<$?~) :: (forall b. f b -> (b -> x) -> a) -> Match (Flux x) a :* fs -> Match (Flux x) a :* (f ': fs)
(<$?~) f = (<:) $ Match $ \(Flux g m) -> f m g
infixr 1 <$?~