module Data.SouSiT.Transform (
Transform,
mergeTransform,
transformSink,
transformSource,
(=$=),
(=$),
($=)
) where
import Data.SouSiT.Sink
import Data.SouSiT.Source
type Transform a b = forall m r . Monad m => Sink b m r -> Sink a m r
transformSink :: Monad m => (Sink b m r -> Sink a m r) -> Sink b m r -> Sink a m r
transformSink t = t
(=$) :: Monad m => (Sink b m r -> Sink a m r) -> Sink b m r -> Sink a m r
(=$) t = t
infixl 2 =$
transformSource :: (Source src, Monad m) => (forall r . Sink b m r -> Sink a m r) -> src m a -> SimpleSource m b
transformSource t src = SimpleSource $ transfer src . transformSink t
($=) :: (Source src, Monad m) => src m a -> (forall r . Sink b m r -> Sink a m r) -> SimpleSource m b
($=) = flip transformSource
infixl 1 $=
mergeTransform :: Monad m => (Sink b m r -> Sink a m r) -> (Sink c m r -> Sink b m r) -> Sink c m r -> Sink a m r
mergeTransform t1 t2 = t1 . t2
(=$=) :: Monad m => (Sink b m r -> Sink a m r) -> (Sink c m r -> Sink b m r) -> Sink c m r -> Sink a m r
(=$=) = mergeTransform