simple-pipe 0.0.0.4 → 0.0.0.5
raw patch · 4 files changed
+48/−37 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Pipe: mapMonad :: (PipeClass p, Monad m) => (forall a. m a -> m a) -> p i o m r -> p i o m r
+ Data.Pipe: onDone :: (PipeClass p, Monad m) => p i o m r -> m b -> p i o m r
- Data.Pipe: bracket :: MonadBaseControl IO m => m a -> (a -> m b) -> (a -> Pipe i o m r) -> Pipe i o m r
+ Data.Pipe: bracket :: (MonadBaseControl IO m, PipeClass p, MonadTrans (p i o), Monad (p i o m)) => m a -> (a -> m b) -> (a -> p i o m r) -> p i o m r
- Data.Pipe: class PipeClass p
+ Data.Pipe: class PipeClass p where p finalize f = p `onBreak` f `onDone` f
- Data.Pipe: finalize :: Monad m => Pipe i o m r -> m b -> Pipe i o m r
+ Data.Pipe: finalize :: (PipeClass p, Monad m) => p i o m r -> m b -> p i o m r
- Data.Pipe: finally :: MonadBaseControl IO m => Pipe i o m r -> m b -> Pipe i o m r
+ Data.Pipe: finally :: (MonadBaseControl IO m, PipeClass p) => p i o m r -> m b -> p i o m r
- Data.Pipe: onBreak :: Monad m => Pipe i o m r -> m b -> Pipe i o m r
+ Data.Pipe: onBreak :: (PipeClass p, Monad m) => p i o m r -> m b -> p i o m r
- Data.Pipe: runPipe :: Monad m => Pipe i o m r -> m (Maybe r)
+ Data.Pipe: runPipe :: (PipeClass p, Monad m) => p i o m r -> m (Maybe r)
Files
- examples/upperFile.hs +2/−1
- simple-pipe.cabal +2/−2
- src/Data/Pipe.hs +43/−32
- src/Data/Pipe/List.hs +1/−2
examples/upperFile.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE PackageImports #-} +import Control.Monad import Data.Pipe import Data.Char import System.IO@@ -20,7 +21,7 @@ hRead :: Handle -> Pipe () String IO () hRead h = do eof <- lift $ hIsEOF h- if eof then return () else do+ unless eof $ do l <- lift $ hGetLine h yield l hRead h
simple-pipe.cabal view
@@ -2,7 +2,7 @@ cabal-version: >= 1.8 name: simple-pipe-version: 0.0.0.4+version: 0.0.0.5 stability: Experimental author: Yoshikuni Jujo <PAF01143@nifty.ne.jp> maintainer: Yoshikuni Jujo <PAF01143@nifty.ne.jp>@@ -87,7 +87,7 @@ source-repository this type: git location: git://github.com/YoshikuniJujo/forest.git- tag: simple-pipe-0.0.0.4+ tag: simple-pipe-0.0.0.5 library hs-source-dirs: src
src/Data/Pipe.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE FlexibleContexts, RankNTypes, PackageImports #-} -module Data.Pipe (- PipeClass(..), Pipe, runPipe, onBreak, finalize, finally, bracket ) where+module Data.Pipe ( PipeClass(..), Pipe, finally, bracket ) where import Control.Applicative import Control.Monad@@ -10,10 +9,17 @@ import "monads-tf" Control.Monad.Trans class PipeClass p where+ runPipe :: Monad m => p i o m r -> m (Maybe r) (=$=) :: Monad m => p a b m x -> p b c m y -> p a c m y yield :: Monad m => o -> p i o m () await :: Monad m => p i o m (Maybe i)+ onBreak :: Monad m => p i o m r -> m b -> p i o m r+ onDone :: Monad m => p i o m r -> m b -> p i o m r+ finalize :: Monad m => p i o m r -> m b -> p i o m r+ mapMonad :: Monad m => (forall a . m a -> m a) -> p i o m r -> p i o m r + p `finalize` f = p `onBreak` f `onDone` f+ data Pipe i o m r = Ready (m ()) o (Pipe i o m r) | Need (m ()) (Maybe i -> Pipe i o m r)@@ -27,6 +33,11 @@ finalizer (Make f _) = f instance PipeClass Pipe where++ runPipe (Done f r) = f >> return (Just r)+ runPipe (Make _ m) = runPipe =<< m+ runPipe _ = return Nothing+ p =$= Done f r = Done (finalizer p >> f) r p =$= Ready f o p' = Ready f o $ p =$= p' Need f n =$= p = Need f $ \i -> n i =$= p@@ -39,9 +50,29 @@ yield x = Ready (return ()) x (return ()) await = Need (return ()) return + onBreak (Ready f0 o p) f = Ready (f0 >> f >> return ()) o $ onBreak p f+ onBreak (Need f0 n) f = Need (f0 >> f >> return ()) $ \i -> onBreak (n i) f+ onBreak (Done f0 r) _ = Done f0 r+ onBreak (Make f0 m) f = Make (f0 >> f >> return ()) $ flip onBreak f `liftM` m++ onDone (Ready f0 o p) f = Ready (voidM f0) o $ finalize p f+ onDone (Need f0 n) f = Need (voidM f0) $ \i -> finalize (n i) f+ onDone (Done f0 r) f = Done (f0 >> f >> return ()) r+ onDone (Make f0 m) f = Make (voidM f0) $ flip finalize f `liftM` m++ finalize (Ready f0 o p) f = Ready (f0 >> f >> return ()) o $ finalize p f+ finalize (Need f0 n) f = Need (f0 >> f >> return ()) $ \i -> finalize (n i) f+ finalize (Done f0 r) f = Done (f0 >> f >> return ()) r+ finalize (Make f0 m) f = Make (f0 >> f >> return ()) $ flip finalize f `liftM` m++ mapMonad k (Ready f o p) = Ready f o $ mapMonad k p+ mapMonad k (Need f n) = Need f $ \i -> mapMonad k $ n i+ mapMonad _ (Done f r) = Done f r+ mapMonad k (Make f m) = Make f . k $ mapMonad k `liftM` m+ instance Monad m => Monad (Pipe i o m) where Ready f o p >>= k = Ready f o $ p >>= k- Need f n >>= k = Need f $ \i -> n i >>= k+ Need f n >>= k = Need f $ n >=> k -- Done f r >>= k = Make (return ()) $ f >> return (k r) Done _ r >>= k = k r Make f m >>= k = Make f $ (>>= k) `liftM` m@@ -52,7 +83,7 @@ instance Monad m => Applicative (Pipe i o m) where pure = return- (<*>) = liftM2 id+ (<*>) = ap instance MonadTrans (Pipe i o) where lift = liftP@@ -60,37 +91,17 @@ instance MonadIO m => MonadIO (Pipe i o m) where liftIO = lift . liftIO -runPipe :: Monad m => Pipe i o m r -> m (Maybe r)-runPipe (Done f r) = f >> return (Just r)-runPipe (Make _ m) = runPipe =<< m-runPipe _ = return Nothing- liftP :: Monad m => m a -> Pipe i o m a liftP m = Make (return ()) $ Done (return ()) `liftM` m -bracket :: MonadBaseControl IO m =>- m a -> (a -> m b) -> (a -> Pipe i o m r) -> Pipe i o m r+bracket :: (MonadBaseControl IO m, PipeClass p, MonadTrans (p i o), Monad (p i o m)) =>+ m a -> (a -> m b) -> (a -> p i o m r) -> p i o m r bracket o c p = do- h <- liftP o- p h `finally` (c h >> return ())--onBreak :: Monad m => Pipe i o m r -> m b -> Pipe i o m r-onBreak (Ready f0 o p) f = Ready (f0 >> f >> return ()) o $ onBreak p f-onBreak (Need f0 n) f = Need (f0 >> f >> return ()) $ \i -> onBreak (n i) f-onBreak (Done f0 r) _ = Done f0 r-onBreak (Make f0 m) f = Make (f0 >> f >> return ()) $ flip onBreak f `liftM` m--finalize :: Monad m => Pipe i o m r -> m b -> Pipe i o m r-finalize (Ready f0 o p) f = Ready (f0 >> f >> return ()) o $ finalize p f-finalize (Need f0 n) f = Need (f0 >> f >> return ()) $ \i -> finalize (n i) f-finalize (Done f0 r) f = Done (f0 >> f >> return ()) r-finalize (Make f0 m) f = Make (f0 >> f >> return ()) $ flip finalize f `liftM` m+ h <- lift o+ p h `finally` void (c h) -finally :: MonadBaseControl IO m => Pipe i o m r -> m b -> Pipe i o m r-finally p f = finalize (mapMake (`onException` f) p) f+finally :: (MonadBaseControl IO m, PipeClass p) => p i o m r -> m b -> p i o m r+finally p f = finalize (mapMonad (`onException` f) p) f -mapMake :: Monad m => (forall a . m a -> m a) -> Pipe i o m r -> Pipe i o m r-mapMake k (Ready f o p) = Ready f o $ mapMake k p-mapMake k (Need f n) = Need f $ \i -> mapMake k $ n i-mapMake _ (Done f r) = Done f r-mapMake k (Make f m) = Make f . k $ mapMake k `liftM` m+voidM :: Monad m => m a -> m ()+voidM = (>> return ())
src/Data/Pipe/List.hs view
@@ -7,8 +7,7 @@ import Data.Pipe fromList :: (Monad m, Monad (p () a m), PipeClass p) => [a] -> p () a m ()-fromList [] = return ()-fromList (x : xs) = yield x >> fromList xs+fromList = foldr ((>>) . yield) (return ()) -- | Consume all values from the stream and return as a list. -- This will pull all values into memory.