on master help sign in
Connect operators
commitfa20984ec37d0e13f7e1efd2c84f143c9591e98c authorMichael <michael@snoyman.com> dateThu 8 Dec 2011, 19:34 (15 years ago) parentcd6501f
3 files changed+31−16
conduit/Data/Conduit.hs+15−9 conduit/Data/Conduit/List.hs+11−1 conduit/sum.hs+5−6
conduit/Data/Conduit.hs+15−9
@@ -11,8 +11,8 @@ module Data.Conduit
1111 , Conduit
1212 -- * Connect pieces together
1313 , ($$)
14− , connectLeft
15− , connectRight
14+ , ($=)
15+ , (=$)
1616 -- * Helper functions
1717 , mkSource
1818 ) where
@@ -128,6 +128,8 @@ mkSource pull = Source $ do
128128 I.atomicModifyIORef buffer (\a -> (s ++ a, ()))
129129 }
130130
131+infixr 0 $$
132+
131133($$) :: MonadBaseControl IO m => Source m a -> Sink a m b -> ResourceT m b
132134Source msource $$ Sink msink = do
133135 sink <- msink
@@ -147,11 +149,13 @@ data NothingAfterEOF = NothingAfterEOF
147149 deriving (Show, Typeable)
148150instance Exception NothingAfterEOF
149151
150−connectLeft :: MonadBaseControl IO m
151− => Source m a
152− -> Conduit a m b
153− -> Source m b
154−connectLeft (Source msource) pipe = Source $ do
152+infixl 1 $=
153+
154+($=) :: MonadBaseControl IO m
155+ => Source m a
156+ -> Conduit a m b
157+ -> Source m b
158+Source msource $= pipe = Source $ do
155159 source <- msource
156160 source' <- unSource $ mkSource $ do
157161 ConduitResult leftover result <- sourcePull source >>= pipe
@@ -161,8 +165,10 @@ connectLeft (Source msource) pipe = Source $ do
161165 where
162166 unSource (Source s) = s
163167
164−connectRight :: MonadBaseControl IO m => Conduit a m b -> Sink b m c -> Sink a m c
165−connectRight pipe (Sink msink) = Sink $ do
168+infixr 0 =$
169+
170+(=$) :: MonadBaseControl IO m => Conduit a m b -> Sink b m c -> Sink a m c
171+pipe =$ Sink msink = Sink $ do
166172 sink <- msink
167173 return $ \stream -> do
168174 ConduitResult leftover stream' <- pipe stream
conduit/Data/Conduit/List.hs+11−1
@@ -3,9 +3,12 @@ module Data.Conduit.List
33 ( fold
44 , fromList
55 , take
6+ , map
7+ , concatMap
68 ) where
79
8−import Prelude hiding (take)
10+import qualified Prelude
11+import Prelude hiding (take, map, concatMap)
912import Data.Conduit
1013import Control.Monad.Trans.Control (MonadBaseControl)
1114import Control.Monad.Base (liftBase)
@@ -51,3 +54,10 @@ take count0 = Sink $ do
5154 rest' = rest ++ a
5255 in ((count', rest'), (count', rest', b))
5356 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)
21import Data.Conduit
3−import Data.Conduit.List
2+import qualified Data.Conduit.List as CL
43import Control.Monad.Trans.Resource
54
65main :: IO ()
76main = do
8− runResourceT (fromList [1..10] $$ do
9− _ <- take 5
10− sum') >>= putStrLn
7+ runResourceT (CL.fromList [1..10] $= CL.concatMap (replicate 2) $$ do
8+ _ <- CL.take 10
9+ CL.map (* 2) =$ sum') >>= putStrLn
1110
1211sum' :: Sink Int IO String
13−sum' = fmap show $ fold (+) 0
12+sum' = fmap show $ CL.fold (+) 0