module Control.Wire.Utils
(
withM_,
filterE,
scan,
scan',
scanE,
splitE,
unalignE,
unlessE
)
where
import Control.Category
import Control.Wire.Core
import Control.Wire.Internal
import Data.Align
import Data.Profunctor
import Data.These
import Prelude hiding ((.), id)
filterE :: (a -> Bool) -> Event a -> Event a
filterE p = catMapE (\x -> if p x then Just x else Nothing)
scan :: (Monad m) => a -> Wire m (Event (a -> a)) a
scan x0 = hold x0 . scanE x0
scan' :: (Monad m) => a -> Wire m (Event (a -> a)) a
scan' x0 = hold' x0 . scanE x0
scanE :: (Applicative m) => a -> Wire m (Event (a -> a)) (Event a)
scanE = lmap (fmap $ \f x -> let y = f x in (y, y)) . unfoldE
splitE :: Event (Either a b) -> (Event a, Event b)
splitE NotNow = (NotNow, NotNow)
splitE (Now (Left x)) = (Now x, NotNow)
splitE (Now (Right y)) = (NotNow, Now y)
unalignE :: Event (These a b) -> (Event a, Event b)
unalignE NotNow = (NotNow, NotNow)
unalignE (Now (This x)) = (Now x, NotNow)
unalignE (Now (That y)) = (NotNow, Now y)
unalignE (Now (These x y)) = (Now x, Now y)
unlessE :: Event a -> Event b -> Event a
unlessE mx my = catMapE justThis (align mx my)
withM_ :: (Monad m) => (s -> Wire m a b) -> m s -> Wire m a b
withM_ w c = withM w (const c)