-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Arrow based stream transducers
--
-- Stream processing library similar to pipes, couduit, or machines.
--
-- Arrow combinatins are supported and can be used with the arrow
-- notation. AFRP-like utilities are also available.
@package machinecell
@version 1.2.0
module Control.Arrow.Machine.Types
-- | To get multiple outputs by one input, the Phase parameter is
-- introduced.
--
-- Once a value Feeded, the machine is Sweeped until it
-- Suspends.
data Phase
Feed :: Phase
Sweep :: Phase
Suspend :: Phase
type StepType a b c = a (Phase, b) (Phase, c, ProcessA a b c)
-- | The stream transducer arrow.
--
-- To construct ProcessA instances, use Plan, arr,
-- functions declared in Utils, or arrow combinations of them.
--
-- May use ArrowChoice and ArrowLoop instance too. but
-- there is a limitation that loop cannot propagate
-- Events to upstream. In such case, use feedback
-- instead.
data ProcessA a b c
ProcessA :: StepType a b c -> ProcessA a b c
step :: ProcessA a b c -> StepType a b c
fit :: (Arrow a, Arrow a') => (forall p q. a p q -> a' p q) -> ProcessA a b c -> ProcessA a' b c
dimapStep :: Arrow a => (b -> c) -> (d -> e) -> StepType a c d -> StepType a b e
parStep :: (Monoid t4, Arrow t, Arrow a) => t (t2, t1) (t4, t5, a b c) -> t (t2, t3) (t4, t6, a b' c') -> t (t2, (t1, t3)) (t4, (t5, t6), a (b, b') (c, c'))
arrStep :: ArrowApply a => (b -> c) -> StepType a b c
-- | Composition is proceeded by the backtracking strategy.
compositeStep :: ArrowApply a => StepType a b d -> StepType a d c -> StepType a b c
compositeStep' :: ArrowApply a => Phase -> StepType a b d -> StepType a d c -> StepType a b c
instance Eq Phase
instance Show Phase
instance (ArrowApply a, ArrowApply a', ArrowAddReader r a a') => ArrowAddReader r (ProcessA a) (ProcessA a')
instance (ArrowApply a, ArrowReader r a) => ArrowReader r (ProcessA a)
instance (ArrowApply a, ArrowLoop a) => ArrowLoop (ProcessA a)
instance ArrowApply a => ArrowChoice (ProcessA a)
instance ArrowApply a => Arrow (ProcessA a)
instance ArrowApply a => Category (ProcessA a)
instance Arrow a => Profunctor (ProcessA a)
instance Monoid Phase
-- | Arrow utilities not related to machinecell library.
module Control.Arrow.Machine.ArrowUtil
kleisli :: Monad m => (a -> m b) -> Kleisli m a b
kleisli0 :: Monad m => m b -> Kleisli m () b
kleisli2 :: Monad m => (a1 -> a2 -> m b) -> Kleisli m (a1, a2) b
kleisli3 :: Monad m => (a1 -> a2 -> a3 -> m b) -> Kleisli m (a1, a2, a3) b
kleisli4 :: Monad m => (a1 -> a2 -> a3 -> a4 -> m b) -> Kleisli m (a1, a2, a3, a4) b
kleisli5 :: Monad m => (a1 -> a2 -> a3 -> a4 -> a5 -> m b) -> Kleisli m (a1, a2, a3, a4, a5) b
reading :: (Monad m, Arrow a) => (forall p q. (p -> m q) -> a p q) -> (b -> ReaderT r m c) -> ReaderArrow r a b c
type AS e = e
toAS :: e -> AS e
fromAS :: AS e -> e
-- | Alternate for elimReader that can be used with both ghc 7.8 and
-- older.
elimR :: ArrowAddReader r a a' => a (AS e) b -> a' (e, AS r) b
module Control.Arrow.Machine.Event
class Occasional a where isOccasion x = not (isNoEvent x) && not (isEnd x)
noEvent :: Occasional a => a
end :: Occasional a => a
isNoEvent :: Occasional a => a -> Bool
isEnd :: Occasional a => a -> Bool
isOccasion :: Occasional a => a -> Bool
data Event a
hEv :: ArrowApply a => a (e, b) c -> a e c -> a (e, Event b) c
hEv' :: ArrowApply a => a (e, b) c -> a e c -> a e c -> a (e, Event b) c
evMaybe :: Arrow a => c -> (b -> c) -> a (Event b) c
fromEvent :: Arrow a => b -> a (Event b) b
evMap :: Arrow a => (b -> c) -> a (Event b) (Event c)
split :: (Arrow a, Occasional b) => a (Event b) b
join :: (Arrow a, Occasional b) => a b (Event b)
split2 :: Event (Event a, Event b) -> (Event a, Event b)
join2 :: (Event a, Event b) -> Event (Event a, Event b)
instance Occasional (Event a)
instance (Occasional a, Occasional b) => Occasional (a, b)
-- | A coroutine monad, inspired by machines library.
module Control.Arrow.Machine.Plan
type PlanT i o m a = FT (PlanF i o) m a
type Plan i o a = forall m. Monad m => PlanT i o m a
await :: Plan i o i
yield :: o -> Plan i o ()
stop :: Plan i o a
stopped :: (ArrowApply a, Occasional c) => ProcessA a b c
constructT :: (Monad m, ArrowApply a) => (forall b. m b -> a () b) -> PlanT i o m r -> ProcessA a (Event i) (Event o)
repeatedlyT :: (Monad m, ArrowApply a) => (forall b. m b -> a () b) -> PlanT i o m r -> ProcessA a (Event i) (Event o)
construct :: ArrowApply a => Plan i o t -> ProcessA a (Event i) (Event o)
repeatedly :: ArrowApply a => Plan i o t -> ProcessA a (Event i) (Event o)
module Control.Arrow.Machine.Exception
catch :: Monad m => PlanT i o m a -> PlanT i o m a -> PlanT i o m a
handle :: Monad m => PlanT i o m a -> PlanT i o m a -> PlanT i o m a
bracket :: Monad m => PlanT i o m a -> (a -> PlanT i o m b) -> (a -> PlanT i o m c) -> PlanT i o m c
bracket_ :: Monad m => PlanT i o m a -> PlanT i o m b -> PlanT i o m c -> PlanT i o m c
bracketOnError :: Monad m => PlanT i o m a -> (a -> PlanT i o m b) -> (a -> PlanT i o m c) -> PlanT i o m c
finally :: Monad m => PlanT i o m a -> PlanT i o m b -> PlanT i o m a
onException :: Monad m => PlanT i o m a -> PlanT i o m b -> PlanT i o m a
module Control.Arrow.Machine.Utils
delay :: (ArrowApply a, Occasional b) => ProcessA a b b
hold :: ArrowApply a => b -> ProcessA a (Event b) b
accum :: ArrowApply a => b -> ProcessA a (Event (b -> b)) b
edge :: (ArrowApply a, Eq b) => ProcessA a b (Event b)
passRecent :: (ArrowApply a, Occasional o) => ProcessA a (AS e) (Event b) -> ProcessA a (e, AS b) o -> ProcessA a (AS e) o
withRecent :: (ArrowApply a, Occasional o) => ProcessA a (e, AS b) o -> ProcessA a (e, AS (Event b)) o
-- | Event version of loop (member of ArrowLoop). Yielding an event
-- to feedback output always creates a new process cycle. So be careful
-- to make an infinite loop.
feedback1 :: (ArrowApply a, Occasional d) => ProcessA a (e, AS d) (c, d) -> ProcessA a (AS e) c
-- | Artificially split into two arrow to use binary operator notation
-- rather than banana brackets.
feedback :: (ArrowApply a, Occasional d) => ProcessA a (e, AS d) b -> ProcessA a (e, AS b) (c, d) -> ProcessA a (AS e) c
switch :: ArrowApply a => ProcessA a b (c, Event t) -> (t -> ProcessA a b c) -> ProcessA a b c
dSwitch :: ArrowApply a => ProcessA a b (c, Event t) -> (t -> ProcessA a b c) -> ProcessA a b c
rSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, Event (ProcessA a b c)) c
drSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, Event (ProcessA a b c)) c
kSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, c) (Event t) -> (ProcessA a b c -> t -> ProcessA a b c) -> ProcessA a b c
dkSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, c) (Event t) -> (ProcessA a b c -> t -> ProcessA a b c) -> ProcessA a b c
pSwitch :: (ArrowApply a, Traversable col) => (forall sf. b -> col sf -> col (ext, sf)) -> col (ProcessA a ext c) -> ProcessA a (b, col c) (Event mng) -> (col (ProcessA a ext c) -> mng -> ProcessA a b (col c)) -> ProcessA a b (col c)
pSwitchB :: (ArrowApply a, Traversable col) => col (ProcessA a b c) -> ProcessA a (b, col c) (Event mng) -> (col (ProcessA a b c) -> mng -> ProcessA a b (col c)) -> ProcessA a b (col c)
rpSwitch :: (ArrowApply a, Traversable col) => (forall sf. b -> col sf -> col (ext, sf)) -> col (ProcessA a ext c) -> ProcessA a (b, Event (col (ProcessA a ext c) -> col (ProcessA a ext c))) (col c)
rpSwitchB :: (ArrowApply a, Traversable col) => col (ProcessA a b c) -> ProcessA a (b, Event (col (ProcessA a b c) -> col (ProcessA a b c))) (col c)
tee :: ArrowApply a => ProcessA a (Event b1, Event b2) (Event (Either b1 b2))
gather :: (ArrowApply a, Foldable f) => ProcessA a (f (Event b)) (Event b)
sample :: ArrowApply a => ProcessA a (Event b1, Event b2) [b1]
-- | It's also possible that source is defined without any await.
--
-- But awaits are useful to synchronize other inputs.
source :: ArrowApply a => [c] -> ProcessA a (Event b) (Event c)
fork :: (ArrowApply a, Foldable f) => ProcessA a (Event (f b)) (Event b)
filter :: ArrowApply a => a o Bool -> ProcessA a (Event o) (Event o)
echo :: ArrowApply a => ProcessA a (Event b) (Event b)
anytime :: ArrowApply a => a b c -> ProcessA a (Event b) (Event c)
par :: (ArrowApply a, Traversable col) => (forall sf. b -> col sf -> col (ext, sf)) -> col (ProcessA a ext c) -> ProcessA a b (col c)
parB :: (ArrowApply a, Traversable col) => col (ProcessA a b c) -> ProcessA a b (col c)
onEnd :: (ArrowApply a, Occasional b) => ProcessA a b (Event ())
module Control.Arrow.Machine.Running
run :: ArrowApply a => ProcessA a (Event b) (Event c) -> a [b] [c]
-- | Represents return values and informations of step executions.
data ExecInfo fa
ExecInfo :: fa -> Bool -> Bool -> ExecInfo fa
yields :: ExecInfo fa -> fa
hasConsumed :: ExecInfo fa -> Bool
hasStopped :: ExecInfo fa -> Bool
stepRun :: ArrowApply a => ProcessA a (Event b) (Event c) -> a b (ExecInfo [c], ProcessA a (Event b) (Event c))
stepYield :: ArrowApply a => ProcessA a (Event b) (Event c) -> a b (ExecInfo (Maybe c), ProcessA a (Event b) (Event c))
instance Eq fa => Eq (ExecInfo fa)
instance Show fa => Show (ExecInfo fa)
instance Alternative f => Monoid (ExecInfo (f a))
-- | Extracted stuff to be used unqualified from ../Machine.hs.
module Control.Arrow.Machine.Core
-- | The stream transducer arrow.
--
-- To construct ProcessA instances, use Plan, arr,
-- functions declared in Utils, or arrow combinations of them.
--
-- May use ArrowChoice and ArrowLoop instance too. but
-- there is a limitation that loop cannot propagate
-- Events to upstream. In such case, use feedback
-- instead.
data ProcessA a b c
fit :: (Arrow a, Arrow a') => (forall p q. a p q -> a' p q) -> ProcessA a b c -> ProcessA a' b c
module Control.Arrow.Machine
-- | The stream transducer arrow.
--
-- To construct ProcessA instances, use Plan, arr,
-- functions declared in Utils, or arrow combinations of them.
--
-- May use ArrowChoice and ArrowLoop instance too. but
-- there is a limitation that loop cannot propagate
-- Events to upstream. In such case, use feedback
-- instead.
data ProcessA a b c
fit :: (Arrow a, Arrow a') => (forall p q. a p q -> a' p q) -> ProcessA a b c -> ProcessA a' b c