machinecell-2.0.1: Arrow based stream transducers

Safe HaskellNone
LanguageHaskell2010

Control.Arrow.Machine.Types

Contents

Synopsis

Basic types

data ProcessA a b c Source

The stream transducer arrow.

To construct ProcessA instances, use Plan, arr, functions declared in Utils, or arrow combinations of them.

class Occasional' a where Source

Signals that can be absent(NoEvent) or end. For composite structure, collapse can be defined as monoidal sum of all member occasionals.

Methods

collapse :: a -> Event () Source

Instances

class Occasional' a => Occasional a where Source

Occasional signals with creation methods.

Methods

noEvent :: a Source

end :: a Source

Instances

data Event a Source

Instances

filterEvent :: (a -> Bool) -> Event a -> Event a Source

evMap :: Arrow a => (b -> c) -> a (Event b) (Event c) Source

Alias of "arr . fmap"

While "ProcessA a (Event b) (Event c)" means a transducer from b to c, function b->c can be lifted into a transducer by fhis function.

But in most cases you needn't call this function in proc-do notations, because arrs are completed automatically while desugaring.

For example,

proc x -> returnA -< f <$> x

is equivalent to

evMap f

Plan monads

type PlanT i o m a = FT (PlanF i o) m a Source

type Plan i o a = forall m. Monad m => PlanT i o m a Source

await :: Plan i o i Source

yield :: o -> Plan i o () Source

stop :: Plan i o a Source

catchP :: Monad m => PlanT i o m a -> PlanT i o m a -> PlanT i o m a Source

Constructing machines from plans

constructT :: (Monad m, ArrowApply a) => (forall b. m b -> a () b) -> PlanT i o m r -> ProcessA a (Event i) (Event o) Source

repeatedlyT :: (Monad m, ArrowApply a) => (forall b. m b -> a () b) -> PlanT i o m r -> ProcessA a (Event i) (Event o) Source

construct :: ArrowApply a => Plan i o t -> ProcessA a (Event i) (Event o) Source

repeatedly :: ArrowApply a => Plan i o t -> ProcessA a (Event i) (Event o) Source

Running machines (at once)

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

Run a machine.

runOn :: (ArrowApply a, Monoid r, Foldable f) => (c -> r) -> ProcessA a (Event b) (Event c) -> a (f b) r Source

Run a machine with results concatenated in terms of a monoid.

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

Run a machine discarding all results.

Running machines (step-by-step)

data ExecInfo fa Source

Represents return values and informations of step executions.

Constructors

ExecInfo 

Fields

yields :: fa
 
hasConsumed :: Bool
 
hasStopped :: Bool
 

Instances

Eq fa => Eq (ExecInfo fa) 
Show fa => Show (ExecInfo fa) 
Alternative f => Monoid (ExecInfo (f a)) 

stepRun :: ArrowApply a => ProcessA a (Event b) (Event c) -> a b (ExecInfo [c], ProcessA a (Event b) (Event c)) Source

Execute until an input consumed and the machine suspended.

stepYield :: ArrowApply a => ProcessA a (Event b) (Event c) -> a b (ExecInfo (Maybe c), ProcessA a (Event b) (Event c)) Source

Execute until an output produced.

Primitive machines - 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 c Source

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

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

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

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 Source

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 Source

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

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

Primitive machines - other safe primitives

fit :: (Arrow a, Arrow a') => (forall p q. a p q -> a' p q) -> ProcessA a b c -> ProcessA a' b c Source

loop' :: ArrowApply a => d -> ProcessA a (b, d) (c, d) -> ProcessA a b c Source

Primitive machines - unsafe

fitEx :: (Arrow a, Arrow a') => (forall p q. a (p, b) (q, c) -> a' (p, b') (q, c')) -> ProcessA a b c -> ProcessA a' b' c' Source

unsafeSteady :: ArrowApply a => a b c -> ProcessA a b c Source

Repeatedly call p.

How many times p is called is indefinite. So p must satisfy the equation below;

p &&& p === p >>> (id &&& id)

unsafeExhaust :: (ArrowApply a, Foldable f) => a b (f c) -> ProcessA a b (Event c) Source

Repeatedly call p.

How many times p is called is indefinite. So p must satisfy the equation below;

p &&& (p >>> arr null) === p &&& arr (const True)

where

null = getAll . foldMap (_ -> All False)