packages feed

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 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)