data-fresh 0.2013.250.1 → 0.2013.251.0
raw patch · 3 files changed
+39/−12 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Control.Monad.Trans.Fresh.Delta: Triplet :: a -> a -> a -> Triplet a
- Control.Monad.Trans.Fresh.Delta: data Triplet a
- Control.Monad.Trans.Fresh.Delta: integerDelta :: Integer -> Cofree Triplet Integer
+ Control.Monad.Trans.Fresh.Delta: integerPairDelta :: (Integer, Integer) -> Cofree Triplet (Integer, Integer)
+ Data.Triplet: Triplet :: a -> a -> a -> Triplet a
+ Data.Triplet: data Triplet a
+ Data.Triplet: instance Applicative Triplet
+ Data.Triplet: instance Eq a => Eq (Triplet a)
+ Data.Triplet: instance Foldable Triplet
+ Data.Triplet: instance Functor Triplet
+ Data.Triplet: instance Read a => Read (Triplet a)
+ Data.Triplet: instance Show a => Show (Triplet a)
+ Data.Triplet: instance Traversable Triplet
Files
- data-fresh.cabal +4/−3
- src/Control/Monad/Trans/Fresh/Delta.hs +13/−9
- src/Data/Triplet.hs +22/−0
data-fresh.cabal view
@@ -1,12 +1,12 @@ name: data-fresh-version: 0.2013.250.1+version: 0.2013.251.0 stability: experimental category: Control synopsis: Interface and functor transformers for fresh values description:- A simple library, mostly containing of an interface to generate fresh values.+ A simple library, which contains an interface for generating fresh values. .- This package also includes two functor transformers which implement this+ This library also includes two functor transformers which implement this interface. They consume fresh values from user-supplied comonads. Currently, two approaches are implemented: .@@ -35,6 +35,7 @@ Control.Monad.Trans.Fresh.Delta Control.Monad.Trans.Fresh.Stream Data.Fresh+ Data.Triplet build-depends: base >= 4 && < 5, free -any,
src/Control/Monad/Trans/Fresh/Delta.hs view
@@ -4,12 +4,12 @@ module Control.Monad.Trans.Fresh.Delta where import Control.Applicative-import Control.Arrow (first)+import Control.Arrow (first, second) import Control.Comonad.Cofree import Control.Monad.Trans.Class+import Data.Bits import Data.Fresh--data Triplet a = Triplet a a a+import Data.Triplet newtype FreshT v m a = FreshT { runFreshT :: Cofree Triplet v -> m (a, Cofree Triplet v) }@@ -28,9 +28,13 @@ 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))+-- | A delta of integer pairs.+integerPairDelta :: (Integer, Integer) -> Cofree Triplet (Integer, Integer)+integerPairDelta n = seedDelta n sukk splt+ where+ sukk = second succ+ splt (m, _) = let m' = m `shiftL` 1+ in ((m', 0), (m' .|. 1, 0)) instance Functor m => Functor (FreshT v m) where fmap f (FreshT xx) = FreshT $ \s -> fmap (first f) (xx s)@@ -42,10 +46,10 @@ 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+ FreshT aa >>= f = FreshT $ \(_ :< Triplet l _ r) -> do+ (a, _) <- aa l let FreshT ff = f a- ff s1+ ff r -- TODO Alternative, MonadPlus -- TODO MonadFix
+ src/Data/Triplet.hs view
@@ -0,0 +1,22 @@+module Data.Triplet where++import Control.Applicative+import Data.Foldable+import Data.Monoid+import Data.Traversable++data Triplet a = Triplet a a a+ deriving (Eq, Read, Show)++instance Functor Triplet where+ fmap f (Triplet l m r) = Triplet (f l) (f m) (f r)++instance Applicative Triplet where+ pure x = Triplet x x x+ Triplet fl fm fr <*> Triplet xl xm xr = Triplet (fl xl) (fm xm) (fr xr)++instance Foldable Triplet where+ foldMap f (Triplet l m r) = mconcat . map f $ [l, m, r]++instance Traversable Triplet where+ sequenceA (Triplet l m r) = Triplet <$> l <*> m <*> r