machinecell-1.1.1: Arrow based stream transducers

Safe HaskellNone

Control.Arrow.Machine.Utils

Contents

Synopsis

AFRP-like utilities

hold :: ArrowApply a => b -> ProcessA a (Event b) bSource

accum :: ArrowApply a => b -> ProcessA a (Event (b -> b)) bSource

edge :: (ArrowApply a, Eq b) => ProcessA a b (Event b)Source

passRecent :: (ArrowApply a, Occasional o) => ProcessA a e (Event b) -> ProcessA a (e, b) o -> ProcessA a e oSource

withRecent :: (ArrowApply a, Occasional o) => ProcessA a (e, b) o -> ProcessA a (e, Event b) oSource

feedback1 :: (ArrowApply a, Occasional d) => ProcessA a (e, d) (c, d) -> ProcessA a e cSource

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.

feedback :: (ArrowApply a, Occasional d) => ProcessA a (e, d) b -> ProcessA a (e, b) (c, d) -> ProcessA a e cSource

Artificially split into two arrow to use binary operator notation rather than banana brackets.

Switches

Switches inspired by Yampa library. Signature is almost same, but collection requirement is not only Functor, but Traversable. This is because of side effects.

switch :: ArrowApply a => ProcessA a b (c, Event t) -> (t -> ProcessA a b c) -> ProcessA a b cSource

dSwitch :: ArrowApply a => ProcessA a b (c, Event t) -> (t -> ProcessA a b c) -> ProcessA a b cSource

rSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, Event (ProcessA a b c)) cSource

drSwitch :: ArrowApply a => ProcessA a b c -> ProcessA a (b, Event (ProcessA a b c)) cSource

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 cSource

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 cSource

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

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

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

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

Other utility arrows

tee :: ArrowApply a => ProcessA a (Event b1, Event b2) (Event (Either b1 b2))Source

gather :: (ArrowApply a, Foldable f) => ProcessA a (f (Event b)) (Event b)Source

sample :: ArrowApply a => ProcessA a (Event b1, Event b2) [b1]Source

source :: ArrowApply a => [c] -> ProcessA a (Event b) (Event c)Source

It's also possible that source is defined without any await.

But awaits are useful to synchronize other inputs.

fork :: (ArrowApply a, Foldable f) => ProcessA a (Event (f b)) (Event b)Source

filter :: ArrowApply a => a o Bool -> ProcessA a (Event o) (Event o)Source

anytime :: ArrowApply a => a b c -> ProcessA a (Event b) (Event c)Source

par :: (ArrowApply a, Traversable col) => (forall sf. b -> col sf -> col (ext, sf)) -> col (ProcessA a ext c) -> ProcessA a b (col c)Source

parB :: (ArrowApply a, Traversable col) => col (ProcessA a b c) -> ProcessA a b (col c)Source