dunai 0.5.1 → 0.5.2
raw patch · 2 files changed
+45/−1 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Control.Monad.Trans.MSF.List: ListT :: m [a] -> ListT a
+ Control.Monad.Trans.MSF.List: [runListT] :: ListT a -> m [a]
+ Control.Monad.Trans.MSF.List: mapListT :: () => (m [a] -> n [b]) -> ListT m a -> ListT n b
+ Control.Monad.Trans.MSF.List: mapMSF :: Monad m => MSF m a b -> MSF m [a] [b]
+ Control.Monad.Trans.MSF.List: newtype ListT (m :: Type -> Type) a
+ Control.Monad.Trans.MSF.List: sequenceS :: Monad m => [MSF m a b] -> MSF (ListT m) a b
+ Control.Monad.Trans.MSF.List: widthFirst :: (Functor m, Monad m) => MSF (ListT m) a b -> MSF m a [b]
Files
- dunai.cabal +2/−1
- src/Control/Monad/Trans/MSF/List.hs +43/−0
dunai.cabal view
@@ -1,5 +1,5 @@ name: dunai-version: 0.5.1+version: 0.5.2 synopsis: Generalised reactive framework supporting classic, arrowized and monadic FRP. homepage: https://github.com/ivanperez-keera/dunai description:@@ -57,6 +57,7 @@ exposed-modules: Control.Monad.Trans.MSF Control.Monad.Trans.MSF.Except Control.Monad.Trans.MSF.Maybe+ Control.Monad.Trans.MSF.List Control.Monad.Trans.MSF.Random Control.Monad.Trans.MSF.Reader Control.Monad.Trans.MSF.RWS
+ src/Control/Monad/Trans/MSF/List.hs view
@@ -0,0 +1,43 @@+module Control.Monad.Trans.MSF.List+ ( module Control.Monad.Trans.MSF.List+ , module Control.Monad.Trans.List+ ) where++-- External+import Control.Monad.Trans.List+ hiding (liftCallCC, liftCatch) -- Avoid conflicting exports++-- Internal+import Data.MonadicStreamFunction+import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))++-- * List monad++-- Name alternative (in the article): collect+widthFirst :: (Functor m, Monad m) => MSF (ListT m) a b -> MSF m a [b]+widthFirst msf = widthFirst' [msf] where+ widthFirst' msfs = MSF $ \a -> do+ (bs, msfs') <- unzip . concat <$> mapM (runListT . flip unMSF a) msfs+ return (bs, widthFirst' msfs')+++-- Name alternatives: "choose", "parallely" (problematic because it's not multicore)+sequenceS :: Monad m => [MSF m a b] -> MSF (ListT m) a b+sequenceS msfs = MSF $ \a -> ListT $ sequence $ apply a <$> msfs+ where+ apply a msf = do+ (b, msf') <- unMSF msf a+ return (b, sequenceS [msf'])+-- sequenceS = foldl (<+>) arrowzero . map liftMSFTrans++-- | Apply an 'MSF' to every input.+mapMSF :: Monad m => MSF m a b -> MSF m [a] [b]+mapMSF = MSF . consume+ where+ consume :: Monad m => MSF m a t -> [a] -> m ([t], MSF m [a] [t])+ consume sf [] = return ([], mapMSF sf)+ consume sf (a:as) = do+ (b, sf') <- unMSF sf a+ (bs, sf'') <- consume sf' as+ b `seq` return (b:bs, sf'')+