packages feed

data-fresh 0.2013.250 → 0.2013.250.1

raw patch · 4 files changed

+152/−54 lines, 4 filesdep +freePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: free

API changes (from Hackage documentation)

- Control.Monad.Trans.Fresh: FreshT :: ((v -> (v, v)) -> v -> m (a, v)) -> FreshT v m a
- Control.Monad.Trans.Fresh: instance (Functor m, Monad m) => Applicative (FreshT v m)
- Control.Monad.Trans.Fresh: instance Applicative m => Fresh v (FreshT v m)
- Control.Monad.Trans.Fresh: instance Functor m => Functor (FreshT v m)
- Control.Monad.Trans.Fresh: instance Monad m => Monad (FreshT v m)
- Control.Monad.Trans.Fresh: instance MonadTrans (FreshT v)
- Control.Monad.Trans.Fresh: newtype FreshT v m a
- Control.Monad.Trans.Fresh: runFreshT :: FreshT v m a -> (v -> (v, v)) -> v -> m (a, v)
+ Control.Monad.Trans.Fresh.Delta: FreshT :: (Cofree Triplet v -> m (a, Cofree Triplet v)) -> FreshT v m a
+ Control.Monad.Trans.Fresh.Delta: Triplet :: a -> a -> a -> Triplet a
+ Control.Monad.Trans.Fresh.Delta: data Triplet a
+ Control.Monad.Trans.Fresh.Delta: instance Applicative m => Applicative (FreshT v m)
+ Control.Monad.Trans.Fresh.Delta: instance Applicative m => Fresh v (FreshT v m)
+ Control.Monad.Trans.Fresh.Delta: instance Functor m => Functor (FreshT v m)
+ Control.Monad.Trans.Fresh.Delta: instance Monad m => Monad (FreshT v m)
+ Control.Monad.Trans.Fresh.Delta: instance MonadTrans (FreshT v)
+ Control.Monad.Trans.Fresh.Delta: integerDelta :: Integer -> Cofree Triplet Integer
+ Control.Monad.Trans.Fresh.Delta: newtype FreshT v m a
+ Control.Monad.Trans.Fresh.Delta: runFreshT :: FreshT v m a -> Cofree Triplet v -> m (a, Cofree Triplet v)
+ Control.Monad.Trans.Fresh.Delta: seedDelta :: v -> (v -> v) -> (v -> (v, v)) -> Cofree Triplet v
+ Control.Monad.Trans.Fresh.Stream: FreshT :: (Cofree Identity v -> m (a, Cofree Identity v)) -> FreshT v m a
+ Control.Monad.Trans.Fresh.Stream: instance (Functor m, Monad m) => Applicative (FreshT v m)
+ Control.Monad.Trans.Fresh.Stream: instance Applicative m => Fresh v (FreshT v m)
+ Control.Monad.Trans.Fresh.Stream: instance Functor m => Functor (FreshT v m)
+ Control.Monad.Trans.Fresh.Stream: instance Monad m => Monad (FreshT v m)
+ Control.Monad.Trans.Fresh.Stream: instance MonadTrans (FreshT v)
+ Control.Monad.Trans.Fresh.Stream: integerStream :: Integer -> Cofree Identity Integer
+ Control.Monad.Trans.Fresh.Stream: listStream :: [v] -> Cofree Identity v
+ Control.Monad.Trans.Fresh.Stream: newtype FreshT v m a
+ Control.Monad.Trans.Fresh.Stream: runFreshT :: FreshT v m a -> Cofree Identity v -> m (a, Cofree Identity v)
+ Control.Monad.Trans.Fresh.Stream: seedStream :: v -> (v -> v) -> Cofree Identity v

Files

data-fresh.cabal view
@@ -1,8 +1,19 @@ name:               data-fresh-version:            0.2013.250+version:            0.2013.250.1 stability:          experimental category:           Control-synopsis:           An interface for generating fresh values+synopsis:           Interface and functor transformers for fresh values+description:+    A simple library, mostly containing of an interface to generate fresh values.+    .+    This package also includes two functor transformers which implement this+    interface. They consume fresh values from user-supplied comonads.+    Currently, two approaches are implemented:+    .+    * In @Stream@, the comonad provides a way to succeed a value.+    .+    * In @Delta@, the comonad provides a way to split the value or to succeeded+    it. The benefit is that the underlying functor doesn't need to be a monad. license:            BSD3 license-file:       LICENSE copyright:          Copyright (c) 2013 Stijn van Drongelen@@ -17,7 +28,16 @@  library     default-language:   Haskell2010-    other-extensions:   FlexibleInstances, MultiParamTypeClasses-    exposed-modules:    Control.Monad.Trans.Fresh, Data.Fresh-    build-depends:      base >= 4 && < 5, transformers >= 0.2 && < 1+    other-extensions:+        FlexibleInstances+        MultiParamTypeClasses+    exposed-modules:+        Control.Monad.Trans.Fresh.Delta+        Control.Monad.Trans.Fresh.Stream+        Data.Fresh+    build-depends:+        base >= 4 && < 5,+        free -any,+        transformers >= 0.2 && < 1     hs-source-dirs:     src+    ghc-options:        -Wall
− src/Control/Monad/Trans/Fresh.hs
@@ -1,49 +0,0 @@-{-# LANGUAGE Haskell2010 #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-module Control.Monad.Trans.Fresh where--import Control.Applicative-import Control.Arrow (first)-import Control.Monad.Trans.Class-import Data.Fresh-import Data.Functor.Identity--newtype FreshT v m a = FreshT { runFreshT :: (v -> (v, v)) -> v -> m (a, v) }--instance Functor m => Functor (FreshT v m) where-    fmap f (FreshT xx) = FreshT $ \sp s -> fmap (first f) (xx sp s)-    x <$ FreshT xx = FreshT $ \sp s -> fmap (setFst x) (xx sp s)-      where-        setFst :: b -> (a, c) -> (b, c)-        setFst x (_, y) = (x, y)--instance (Functor m, Monad m) => Applicative (FreshT v m) where-    pure = return-    FreshT ff <*> FreshT xx = FreshT $ \sp s -> do-        (fv, s1) <- ff sp s    -        (xv, s2) <- xx sp s1-        return (fv xv, s2)-    --FreshT ll *> FreshT rr = FreshT $ undefined-    --FreshT ll <* FreshT rr = FreshT $ undefined--instance Monad m => Monad (FreshT v m) where-    return x = FreshT $ \_ s -> return (x, s)-    FreshT aa >>= f = FreshT $ \sp s -> do-        (a, s1) <- aa sp s-        let FreshT ff = f a-        ff sp s1-    -- (>>) = (*>)---- TODO Alternative, MonadPlus--- TODO MonadFix--instance MonadTrans (FreshT v) where-    lift m = FreshT $ \_ s -> do-                r <- m-                return (r, s)---- TODO MonadIO--instance Applicative m => Fresh v (FreshT v m) where-    fresh = FreshT $ \sp s -> pure (sp s)
+ src/Control/Monad/Trans/Fresh/Delta.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+module Control.Monad.Trans.Fresh.Delta where++import Control.Applicative+import Control.Arrow (first)+import Control.Comonad.Cofree+import Control.Monad.Trans.Class+import Data.Fresh++data Triplet a = Triplet a a a++newtype FreshT v m a = FreshT+    { runFreshT :: Cofree Triplet v -> m (a, Cofree Triplet v) }++-- | Creates a @Cofree Triplet v@, based on a seed, and functions to split+--   and succeed it.+seedDelta+    :: v                -- ^ Delta seed+    -> (v -> v)         -- ^ Successor+    -> (v -> (v, v))    -- ^ Splitter+    -> Cofree Triplet v+seedDelta seed sukk splt = go seed+  where+    go tt = tt `seq` (tt :< Triplet (go ll) (go mm) (go rr))+      where+        mm = sukk tt+        (ll, rr) = splt tt++-- | A delta of integers.+integerDelta :: Integer -> Cofree Triplet Integer+integerDelta n = seedDelta n succ (\m -> let m' = 2 * m in (m', m' + 1))++instance Functor m => Functor (FreshT v m) where+    fmap f (FreshT xx) = FreshT $ \s -> fmap (first f) (xx s)++instance Applicative m => Applicative (FreshT v m) where+    pure x = FreshT $ \s -> pure (x, s)+    FreshT ff <*> FreshT xx = FreshT $ \(_ :< Triplet l _ r)+        -> (\(f, sf) (x, _) -> (f x, sf)) <$> ff l <*> xx r++instance Monad m => Monad (FreshT v m) where+    return x = FreshT $ \s -> return (x, s)+    FreshT aa >>= f = FreshT $ \s -> do+        (a, s1) <- aa s+        let FreshT ff = f a+        ff s1++-- TODO Alternative, MonadPlus+-- TODO MonadFix++instance MonadTrans (FreshT v) where+    lift m = FreshT $ \s -> do+                r <- m+                return (r, s)++-- TODO MonadIO++instance Applicative m => Fresh v (FreshT v m) where+    fresh = FreshT $ \(s :< Triplet _ s' _) -> pure (s, s')
+ src/Control/Monad/Trans/Fresh/Stream.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+module Control.Monad.Trans.Fresh.Stream where++import Control.Applicative+import Control.Arrow (first)+import Control.Comonad.Cofree+import Control.Monad.Trans.Class+import Data.Fresh+import Data.Functor.Identity++newtype FreshT v m a = FreshT+    { runFreshT :: Cofree Identity v -> m (a, Cofree Identity v) }++-- | Creates a @Cofree Identity v@, based on a seed, and a function to split it.+seedStream+    :: v                -- ^ Stream seed+    -> (v -> v)         -- ^ Successor+    -> Cofree Identity v+seedStream seed sukk = go seed+  where+    go tt = tt `seq` (mm :< Identity (go mm))+      where+        mm = sukk tt++-- | A stream of integers.+integerStream :: Integer -> Cofree Identity Integer+integerStream n = seedStream n succ++-- | Creates a @Cofree Identity v@ based on an infinite list.+--+--   This function will cause an error when the list turns out to be finite.+listStream :: [v] -> Cofree Identity v+listStream (x:xs) = x :< Identity (listStream xs)+listStream [] = error "Can't create a stream from a finite list."++instance Functor m => Functor (FreshT v m) where+    fmap f (FreshT xx) = FreshT $ \s -> fmap (first f) (xx s)++instance (Functor m, Monad m) => Applicative (FreshT v m) where+    pure = return+    FreshT ff <*> FreshT xx = FreshT $ \s -> do+        (fv, s1) <- ff s+        (xv, s2) <- xx s1+        return (fv xv, s2)++instance Monad m => Monad (FreshT v m) where+    return x = FreshT $ \s -> return (x, s)+    FreshT aa >>= f = FreshT $ \s -> do+        (a, s1) <- aa s+        let FreshT ff = f a+        ff s1++-- TODO Alternative, MonadPlus+-- TODO MonadFix++instance MonadTrans (FreshT v) where+    lift m = FreshT $ \s -> do+                r <- m+                return (r, s)++-- TODO MonadIO++instance Applicative m => Fresh v (FreshT v m) where+    fresh = FreshT $ \(s :< Identity s') -> pure (s, s')