on master help sign in
Connect operators
fa20984Michael
conduit/Data/Conduit.hs+15−9
@@ -11,8 +11,8 @@ module Data.Conduit
11 , Conduit
11 , Conduit
12 -- * Connect pieces together
12 -- * Connect pieces together
13 , ($$)
13 , ($$)
14− , connectLeft
14+ , ($=)
15− , connectRight
15+ , (=$)
16 -- * Helper functions
16 -- * Helper functions
17 , mkSource
17 , mkSource
18 ) where
18 ) where
@@ -128,6 +128,8 @@ mkSource pull = Source $ do
128 I.atomicModifyIORef buffer (\a -> (s ++ a, ()))
128 I.atomicModifyIORef buffer (\a -> (s ++ a, ()))
129 }
129 }
130
130
131+infixr 0 $$
132+
131($$) :: MonadBaseControl IO m => Source m a -> Sink a m b -> ResourceT m b
133($$) :: MonadBaseControl IO m => Source m a -> Sink a m b -> ResourceT m b
132Source msource $$ Sink msink = do
134Source msource $$ Sink msink = do
133 sink <- msink
135 sink <- msink
@@ -147,11 +149,13 @@ data NothingAfterEOF = NothingAfterEOF
147 deriving (Show, Typeable)
149 deriving (Show, Typeable)
148instance Exception NothingAfterEOF
150instance Exception NothingAfterEOF
149
151
152+infixl 1 $=
153+
150−connectLeft :: MonadBaseControl IO m
154+($=) :: MonadBaseControl IO m
151− => Source m a
155+ => Source m a
152− -> Conduit a m b
156+ -> Conduit a m b
153− -> Source m b
157+ -> Source m b
154−connectLeft (Source msource) pipe = Source $ do
158+Source msource $= pipe = Source $ do
155 source <- msource
159 source <- msource
156 source' <- unSource $ mkSource $ do
160 source' <- unSource $ mkSource $ do
157 ConduitResult leftover result <- sourcePull source >>= pipe
161 ConduitResult leftover result <- sourcePull source >>= pipe
@@ -161,8 +165,10 @@ connectLeft (Source msource) pipe = Source $ do
161 where
165 where
162 unSource (Source s) = s
166 unSource (Source s) = s
163
167
168+infixr 0 =$
169+
164−connectRight :: MonadBaseControl IO m => Conduit a m b -> Sink b m c -> Sink a m c
170+(=$) :: MonadBaseControl IO m => Conduit a m b -> Sink b m c -> Sink a m c
165−connectRight pipe (Sink msink) = Sink $ do
171+pipe =$ Sink msink = Sink $ do
166 sink <- msink
172 sink <- msink
167 return $ \stream -> do
173 return $ \stream -> do
168 ConduitResult leftover stream' <- pipe stream
174 ConduitResult leftover stream' <- pipe stream
conduit/Data/Conduit/List.hs+11−1
@@ -3,9 +3,12 @@ module Data.Conduit.List
3 ( fold
3 ( fold
4 , fromList
4 , fromList
5 , take
5 , take
6+ , map
7+ , concatMap
6 ) where
8 ) where
7
9
10+import qualified Prelude
8−import Prelude hiding (take)
11+import Prelude hiding (take, map, concatMap)
9import Data.Conduit
12import Data.Conduit
10import Control.Monad.Trans.Control (MonadBaseControl)
13import Control.Monad.Trans.Control (MonadBaseControl)
11import Control.Monad.Base (liftBase)
14import Control.Monad.Base (liftBase)
@@ -51,3 +54,10 @@ take count0 = Sink $ do
51 rest' = rest ++ a
54 rest' = rest ++ a
52 in ((count', rest'), (count', rest', b))
55 in ((count', rest'), (count', rest', b))
53 return $ SinkResult b $ if count == 0 then Just rest' else Nothing
56 return $ SinkResult b $ if count == 0 then Just rest' else Nothing
57+
58+map :: Monad m => (a -> b) -> Conduit a m b
59+map f a = return $ ConduitResult [] $ fmap f a
60+
61+concatMap :: Monad m => (a -> [b]) -> Conduit a m b
62+concatMap _ EOF = return $ ConduitResult [] EOF
63+concatMap f (Chunks l) = return $ ConduitResult [] $ Chunks $ Prelude.concatMap f l
conduit/sum.hs+5−6
@@ -1,13 +1,12 @@
1−import Prelude hiding (take)
2import Data.Conduit
1import Data.Conduit
3−import Data.Conduit.List
2+import qualified Data.Conduit.List as CL
4import Control.Monad.Trans.Resource
3import Control.Monad.Trans.Resource
5
4
6main :: IO ()
5main :: IO ()
7main = do
6main = do
8− runResourceT (fromList [1..10] $$ do
7+ runResourceT (CL.fromList [1..10] $= CL.concatMap (replicate 2) $$ do
9− _ <- take 5
8+ _ <- CL.take 10
10− sum') >>= putStrLn
9+ CL.map (* 2) =$ sum') >>= putStrLn
11
10
12sum' :: Sink Int IO String
11sum' :: Sink Int IO String
13−sum' = fmap show $ fold (+) 0
12+sum' = fmap show $ CL.fold (+) 0