packages feed

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 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'')+