stm-conduit 2.5.0 → 2.5.1
raw patch · 3 files changed
+23/−20 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Conduit.TMChan: (<=>) :: (MonadIO m, MonadBaseControl IO m) => Show i => Conduit i (ResourceT m) i -> Conduit i (ResourceT m) i -> ResourceT m (Conduit i (ResourceT m) i)
+ Data.Conduit.TMChan: (<=>) :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi) => Show i => Conduit i (ResourceT mi) i -> Conduit i (ResourceT mi) i -> ResourceT mi (Conduit i mo i)
- Data.Conduit.TMChan: (>=<) :: (MonadIO m, MonadBaseControl IO m) => Source (ResourceT m) a -> Source (ResourceT m) a -> ResourceT m (Source (ResourceT m) a)
+ Data.Conduit.TMChan: (>=<) :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi) => Source mi a -> Source mi a -> mi (Source mo a)
- Data.Conduit.TMChan: mergeConduits :: (MonadIO m, MonadBaseControl IO m) => [Conduit i (ResourceT m) o] -> Int -> ResourceT m (Conduit i (ResourceT m) o)
+ Data.Conduit.TMChan: mergeConduits :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi) => [Conduit i (ResourceT mi) o] -> Int -> ResourceT mi (Conduit i mo o)
- Data.Conduit.TMChan: mergeSources :: (MonadIO m, MonadBaseControl IO m) => [Source (ResourceT m) a] -> Int -> ResourceT m (Source (ResourceT m) a)
+ Data.Conduit.TMChan: mergeSources :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi) => [Source mi a] -> Int -> mi (Source mo a)
Files
- Data/Conduit/TMChan.hs +20/−17
- stm-conduit.cabal +1/−1
- test/Test.hs +2/−2
Data/Conduit/TMChan.hs view
@@ -56,6 +56,7 @@ import Control.Applicative import Control.Monad import Control.Monad.IO.Class ( liftIO, MonadIO )+import Control.Monad.Trans.Class import Control.Monad.Trans.Resource import Control.Concurrent.STM import Control.Concurrent.STM.TBMChan@@ -146,10 +147,10 @@ -- -- The order of the new source's data is undefined, but it will be some -- combination of the two given sources.-(>=<) :: (MonadIO m, MonadBaseControl IO m)- => Source (ResourceT m) a- -> Source (ResourceT m) a- -> ResourceT m (Source (ResourceT m) a)+(>=<) :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi)+ => Source mi a+ -> Source mi a+ -> mi (Source mo a) sa >=< sb = mergeSources [ sa, sb ] 16 {-# INLINE (>=<) #-} @@ -163,14 +164,15 @@ -- sources in a first-come-first-serve basis. -- -- The order of the new source's data is undefined, but it will be some--- combination of the given sources.-mergeSources :: (MonadIO m, MonadBaseControl IO m)- => [Source (ResourceT m) a] -- ^ The sources to merge.+-- combination of the given sources. The monad of the resultant source+-- (@mo@) is independent of the monads of the input sources (@mi@).+mergeSources :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi)+ => [Source mi a] -- ^ The sources to merge. -> Int -- ^ The bound of the intermediate channel.- -> ResourceT m (Source (ResourceT m) a)+ -> mi (Source mo a) mergeSources sx bound = do c <- liftSTM $ newTBMChan bound refcount <- liftSTM . newTVar $ length sx- mapM_ (\s -> resourceForkIO $ s $$ chanSink c writeTBMChan $ decRefcount refcount) sx+ mapM_ (\s -> runResourceT $ resourceForkIO $ s $$ chanSink c writeTBMChan $ decRefcount refcount) (map (transPipe lift) sx) return $ sourceTBMChan c -- | Combines two conduits with unbounded channels, creating a new conduit@@ -178,11 +180,11 @@ -- -- The order of the new conduit's output is undefined, but it will be some -- combination of the two given conduits.-(<=>) :: (MonadIO m, MonadBaseControl IO m)+(<=>) :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi) => Show i- => Conduit i (ResourceT m) i- -> Conduit i (ResourceT m) i- -> ResourceT m (Conduit i (ResourceT m) i)+ => Conduit i (ResourceT mi) i+ -> Conduit i (ResourceT mi) i+ -> ResourceT mi (Conduit i mo i) sa <=> sb = mergeConduits [ sa, sb ] 16 {-# INLINE (<=>) #-} @@ -191,11 +193,12 @@ -- given conduits in a first-come-first-serve basis. -- -- The order of the new conduits's outputs is undefined, but it will be some--- combination of the given conduits.-mergeConduits :: (MonadIO m, MonadBaseControl IO m)- => [Conduit i (ResourceT m) o] -- ^ The conduits to merge.+-- combination of the given conduits. The monad of the resultant conduit+-- (@mo@) is independent of the monads of the input conduits (@mi@).+mergeConduits :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi)+ => [Conduit i (ResourceT mi) o] -- ^ The conduits to merge. -> Int -- ^ The bound for the channels.- -> ResourceT m (Conduit i (ResourceT m) o)+ -> ResourceT mi (Conduit i mo o) mergeConduits conduits bound = do let len = length conduits refcount <- liftSTM $ newTVar len
stm-conduit.cabal view
@@ -1,5 +1,5 @@ Name: stm-conduit-Version: 2.5.0+Version: 2.5.1 Synopsis: Introduces conduits to channels, and promotes using conduits concurrently. Description: Provides two simple conduit wrappers around STM
test/Test.hs view
@@ -70,7 +70,7 @@ test_multipleWriters = do ms <- runResourceT $ mergeSources [ sourceList ([1..10]::[Integer]) , sourceList ([11..20]::[Integer]) ] 3- xs <- runResourceT $ ms $$ consume+ xs <- ms $$ consume assertEqual "for the numbers [1..10] and [11..20]," [1..20] $ sort xs test_asyncOperator = do sum' <- CL.sourceList [1..n] $$ CL.fold (+) 0@@ -119,5 +119,5 @@ let input = [1..10] expected = Prelude.map (2 *) input ++ tail (Prelude.scanl (+) 0 input)- xs <- runResourceT $ sourceList ([1..10] :: [Integer]) $$ merged =$ consume+ xs <- sourceList ([1..10] :: [Integer]) $$ merged =$ consume assertEqual "merged results" (sort expected) (sort xs)