concurrent-machines 0.2.1 → 0.2.3
raw patch · 7 files changed
+23/−23 lines, 7 filesdep ~basedep ~machinesdep ~timePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, machines, time, transformers, transformers-base
API changes (from Hackage documentation)
+ Data.Machine.Concurrent: infixl 7 >~>
- Data.Machine.Concurrent: fanout :: (Functor m, MonadBaseControl IO m, Semigroup r) => [ProcessT m a r] -> ProcessT m a r
+ Data.Machine.Concurrent: fanout :: (MonadBaseControl IO m, Semigroup r) => [ProcessT m a r] -> ProcessT m a r
- Data.Machine.Concurrent: fanoutSteps :: (Functor m, MonadBaseControl IO m, Monoid r) => [ProcessT m a r] -> ProcessT m a r
+ Data.Machine.Concurrent: fanoutSteps :: (MonadBaseControl IO m, Monoid r) => [ProcessT m a r] -> ProcessT m a r
- Data.Machine.Concurrent: mergeSum :: MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (Either a b) r
+ Data.Machine.Concurrent: mergeSum :: forall m a b r. MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (Either a b) r
- Data.Machine.Concurrent: splitProd :: MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (a, b) r
+ Data.Machine.Concurrent: splitProd :: forall m a b r. MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (a, b) r
- Data.Machine.Concurrent: splitSum :: MonadBaseControl IO m => ProcessT m a b -> ProcessT m c d -> ProcessT m (Either a c) (Either b d)
+ Data.Machine.Concurrent: splitSum :: forall m a b c d. MonadBaseControl IO m => ProcessT m a b -> ProcessT m c d -> ProcessT m (Either a c) (Either b d)
- Data.Machine.Concurrent: tee :: MonadBaseControl IO m => ProcessT m a a' -> ProcessT m b b' -> TeeT m a' b' c -> TeeT m a b c
+ Data.Machine.Concurrent: tee :: forall m a a' b b' c. MonadBaseControl IO m => ProcessT m a a' -> ProcessT m b b' -> TeeT m a' b' c -> TeeT m a b c
- Data.Machine.Concurrent: wye :: (MonadBaseControl IO m) => ProcessT m a a' -> ProcessT m b b' -> WyeT m a' b' c -> WyeT m a b c
+ Data.Machine.Concurrent: wye :: forall m a a' b b' c. (MonadBaseControl IO m) => ProcessT m a a' -> ProcessT m b b' -> WyeT m a' b' c -> WyeT m a b c
- Data.Machine.Concurrent.AsyncStep: stepAsync :: MonadBaseControl IO m => (forall c. k c -> k' c) -> AsyncStep m k a' -> (a' -> d) -> d -> d -> (AsyncStep m k a' -> d -> MachineT m k' b) -> MachineT m k' b
+ Data.Machine.Concurrent.AsyncStep: stepAsync :: forall m k k' a' d b. MonadBaseControl IO m => (forall c. k c -> k' c) -> AsyncStep m k a' -> (a' -> d) -> d -> d -> (AsyncStep m k a' -> d -> MachineT m k' b) -> MachineT m k' b
- Data.Machine.Concurrent.Buffer: mediatedConnect :: MonadBaseControl IO m => t -> (t -> b -> BufferRoom t) -> (t -> Maybe (b, t)) -> MachineT m k b -> ProcessT m b c -> MachineT m k c
+ Data.Machine.Concurrent.Buffer: mediatedConnect :: forall m t b k c. MonadBaseControl IO m => t -> (t -> b -> BufferRoom t) -> (t -> Maybe (b, t)) -> MachineT m k b -> ProcessT m b c -> MachineT m k c
- Data.Machine.Concurrent.Fanout: fanout :: (Functor m, MonadBaseControl IO m, Semigroup r) => [ProcessT m a r] -> ProcessT m a r
+ Data.Machine.Concurrent.Fanout: fanout :: (MonadBaseControl IO m, Semigroup r) => [ProcessT m a r] -> ProcessT m a r
- Data.Machine.Concurrent.Fanout: fanoutSteps :: (Functor m, MonadBaseControl IO m, Monoid r) => [ProcessT m a r] -> ProcessT m a r
+ Data.Machine.Concurrent.Fanout: fanoutSteps :: (MonadBaseControl IO m, Monoid r) => [ProcessT m a r] -> ProcessT m a r
- Data.Machine.Concurrent.Scatter: mergeSum :: MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (Either a b) r
+ Data.Machine.Concurrent.Scatter: mergeSum :: forall m a b r. MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (Either a b) r
- Data.Machine.Concurrent.Scatter: splitProd :: MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (a, b) r
+ Data.Machine.Concurrent.Scatter: splitProd :: forall m a b r. MonadBaseControl IO m => ProcessT m a r -> ProcessT m b r -> ProcessT m (a, b) r
- Data.Machine.Concurrent.Scatter: splitSum :: MonadBaseControl IO m => ProcessT m a b -> ProcessT m c d -> ProcessT m (Either a c) (Either b d)
+ Data.Machine.Concurrent.Scatter: splitSum :: forall m a b c d. MonadBaseControl IO m => ProcessT m a b -> ProcessT m c d -> ProcessT m (Either a c) (Either b d)
- Data.Machine.Concurrent.Tee: tee :: MonadBaseControl IO m => ProcessT m a a' -> ProcessT m b b' -> TeeT m a' b' c -> TeeT m a b c
+ Data.Machine.Concurrent.Tee: tee :: forall m a a' b b' c. MonadBaseControl IO m => ProcessT m a a' -> ProcessT m b b' -> TeeT m a' b' c -> TeeT m a b c
- Data.Machine.Concurrent.Wye: wye :: (MonadBaseControl IO m) => ProcessT m a a' -> ProcessT m b b' -> WyeT m a' b' c -> WyeT m a b c
+ Data.Machine.Concurrent.Wye: wye :: forall m a a' b b' c. (MonadBaseControl IO m) => ProcessT m a a' -> ProcessT m b b' -> WyeT m a' b' c -> WyeT m a b c
Files
- CHANGELOG.md +5/−0
- concurrent-machines.cabal +7/−6
- src/Data/Machine/Concurrent.hs +3/−6
- src/Data/Machine/Concurrent/Buffer.hs +2/−2
- src/Data/Machine/Concurrent/Fanout.hs +3/−3
- src/Data/Machine/Concurrent/Scatter.hs +2/−4
- src/Data/Machine/Concurrent/Tee.hs +1/−2
CHANGELOG.md view
@@ -1,3 +1,8 @@+# 0.2.3++- GHC-8.0.1 compatibility+- Dropped support for GHC-7.8+ # 0.2.0 - Fix fanout behavior (Ben SInclair)
concurrent-machines.cabal view
@@ -1,5 +1,5 @@ name: concurrent-machines-version: 0.2.1+version: 0.2.3 synopsis: Concurrent networked stream transducers description: A simple use-case for this library is to run the stages@@ -31,6 +31,7 @@ build-type: Simple extra-source-files: README.md, CHANGELOG.md cabal-version: >=1.10+tested-with: GHC == 7.10.3, GHC == 8.0.1 source-repository head type: git@@ -48,13 +49,13 @@ -- other-modules: other-extensions: GADTs, FlexibleContexts, RankNTypes, TupleSections, ScopedTypeVariables- build-depends: base >= 4.6 && < 5,+ build-depends: base >= 4.6 && < 4.10, monad-control >= 1.0 && < 1.1,- transformers >= 0.4 && < 0.5,- time >= 1.4 && < 1.6,+ transformers >= 0.4 && < 0.6,+ time >= 1.4 && < 1.7, containers >= 0.5 && < 0.6,- transformers-base >= 0.4 && < 0.5,- machines >= 0.5 && < 0.6,+ transformers-base >= 0.4 && < 0.6,+ machines >= 0.5 && < 0.7, async >= 2.0.1 && < 2.2, lifted-async >= 0.1 && < 0.9, semigroups >= 0.8 && < 0.19
src/Data/Machine/Concurrent.hs view
@@ -77,8 +77,7 @@ => MachineT m k a -> ProcessT m a b -> MachineT m k b racers src snk = MachineT . join $ go <$> (Just <$> asyncRun src) <*> asyncRun snk- where go :: MonadBaseControl IO m- => Maybe (AsyncStep m k a)+ where go :: Maybe (AsyncStep m k a) -> AsyncStep m (Is a) b -> m (MachineStep m k b) go srcA snkA =@@ -106,8 +105,7 @@ go <$> (Just <$> asyncRun k) <*> asyncRun (f o) -- If we have an upstream source value ready, we must flush -- all available values yielded by downstream until it awaits.- flushDown :: Monad m- => ProcessT m a b+ flushDown :: ProcessT m a b -> ((a -> ProcessT m a b) -> m (MachineStep m k b)) -> m (MachineStep m k b) flushDown m k = runMachineT m >>= \s -> case s of@@ -117,8 +115,7 @@ -- If downstream is awaiting an input, we must pull in all -- necessary upstream awaits until we have a yielded value to -- push downstream.- feedUp :: MonadBaseControl IO m- => MachineT m k a+ feedUp :: MachineT m k a -> (a -> MachineT m k a -> m (MachineStep m k b)) -> m (MachineStep m k b) feedUp m k = runMachineT m >>= \s -> case s of
src/Data/Machine/Concurrent/Buffer.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, FlexibleContexts, GADTs, ScopedTypeVariables, TupleSections #-}+ {-# LANGUAGE CPP, FlexibleContexts, GADTs, ScopedTypeVariables, TupleSections #-} -- | Place buffers between two machines. This is most useful with -- irregular production rates. module Data.Machine.Concurrent.Buffer (@@ -25,7 +25,7 @@ -- | Drain downstream until it awaits a value, then pass the awaiting -- step to the given function.-drain :: (Functor m, Monad m)+drain :: Monad m => MachineStep m k a -> (MachineStep m k a -> m (MachineStep m k' a)) -> m (MachineStep m k' a)
src/Data/Machine/Concurrent/Fanout.hs view
@@ -31,7 +31,7 @@ -- | Like 'Data.List.mapAccumL' but with a monadic accumulating -- function.-mapAccumLM :: (Functor m, MonadBaseControl IO m)+mapAccumLM :: MonadBaseControl IO m => (acc -> x -> m (acc, y)) -> acc -> [Async (StM m x)] -> m (acc, [y]) mapAccumLM f z = fmap (second ($ [])) . foldM aux (z,id)@@ -51,7 +51,7 @@ -- | Share inputs with each of a list of processes in lockstep. Any -- values yielded by the processes for a given input are combined into -- a single yield from the composite process.-fanout :: (Functor m, MonadBaseControl IO m, Semigroup r)+fanout :: (MonadBaseControl IO m, Semigroup r) => [ProcessT m a r] -> ProcessT m a r fanout xs = encased $ Await (MachineT . aux) Refl (fanout xs) where aux y = do (rs,xs') <- mapM (feed y) xs >>= mapAccumLM yields []@@ -70,7 +70,7 @@ -- run a collection of 'ProcessT's that await but don't yield some -- number of times, you can use 'fanOutSteps . map (fmap (const ()))' -- followed by a 'taking' process.-fanoutSteps :: (Functor m, MonadBaseControl IO m, Monoid r)+fanoutSteps :: (MonadBaseControl IO m, Monoid r) => [ProcessT m a r] -> ProcessT m a r fanoutSteps xs = encased $ Await (MachineT . aux) Refl (fanoutSteps xs) where aux y = do (rs,xs') <- mapM (feed y) xs >>= mapAccumLM yields []
src/Data/Machine/Concurrent/Scatter.hs view
@@ -92,8 +92,7 @@ mergeSum snkL snkR = MachineT $ do sl <- asyncRun snkL sr <- asyncRun snkR go sl sr- where go :: MonadBaseControl IO m- => AsyncStep m (Is a) r+ where go :: AsyncStep m (Is a) r -> AsyncStep m (Is b) r -> m (MachineStep m (Is (Either a b)) r) go sl sr = waitEither sl sr >>= @@ -137,8 +136,7 @@ lft = Left rgt :: d -> Either b d rgt = Right- go :: MonadBaseControl IO m- => AsyncStep m (Is a) (Either b d)+ go :: AsyncStep m (Is a) (Either b d) -> AsyncStep m (Is c) (Either b d) -> m (MachineStep m (Is (Either a c)) (Either b d)) go sl sr = waitEither sl sr >>=
src/Data/Machine/Concurrent/Tee.hs view
@@ -14,8 +14,7 @@ tee ma mb m = MachineT $ do srcL <- asyncRun ma srcR <- asyncRun mb go m (Just srcL) (Just srcR)- where go :: MonadBaseControl IO m- => TeeT m a' b' c+ where go :: TeeT m a' b' c -> Maybe (AsyncStep m (Is a) a') -> Maybe (AsyncStep m (Is b) b') -> m (MachineStep m (T a b) c)