Copyright | (c) 2013 Ertugrul Soeylemez |
---|---|

License | BSD3 |

Maintainer | Ertugrul Soeylemez <es@ertes.de> |

Safe Haskell | None |

Language | Haskell2010 |

- (-->) :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m a b
- (>--) :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m a b
- modes :: (Monad m, Ord k) => k -> (k -> Wire s e m a b) -> Wire s e m (a, Event k) b
- switch :: (Monad m, Monoid s) => Wire s e m a (b, Event (Wire s e m a b)) -> Wire s e m a b
- dSwitch :: Monad m => Wire s e m a (b, Event (Wire s e m a b)) -> Wire s e m a b
- kSwitch :: (Monad m, Monoid s) => Wire s e m a b -> Wire s e m (a, b) (Event (Wire s e m a b -> Wire s e m a b)) -> Wire s e m a b
- dkSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, b) (Event (Wire s e m a b -> Wire s e m a b)) -> Wire s e m a b
- rSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b)) b
- drSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b)) b
- alternate :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m (a, Event x) b
- krSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b -> Wire s e m a b)) b
- dkrSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b -> Wire s e m a b)) b

# Simple switching

(-->) :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m a b infixr 1 Source

Acts like the first wire until it inhibits, then switches to the second wire. Infixr 1.

- Depends: like current wire.
- Inhibits: after switching like the second wire.
- Switch: now.

(>--) :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m a b infixr 1 Source

Acts like the first wire until the second starts producing, at which point it switches to the second wire. Infixr 1.

- Depends: like current wire.
- Inhibits: after switching like the second wire.
- Switch: now.

# Context switching

:: (Monad m, Ord k) | |

=> k | Initial mode. |

-> (k -> Wire s e m a b) | Select wire for given mode. |

-> Wire s e m (a, Event k) b |

Route the left input signal based on the current mode. The right input signal can be used to change the current mode. When switching away from a mode and then switching back to it, it will be resumed. Freezes time during inactivity.

- Complexity: O(n * log n) space, O(log n) lookup time on switch wrt number of started, inactive modes.
- Depends: like currently active wire (left), now (right).
- Inhibits: when active wire inhibits.
- Switch: now on mode change.

# Event-based switching

## Intrinsic

switch :: (Monad m, Monoid s) => Wire s e m a (b, Event (Wire s e m a b)) -> Wire s e m a b Source

Intrinsic switch: Start with the given wire. As soon as its event occurs, switch to the wire in the event's value.

- Inhibits: like argument wire until switch, then like the new wire.
- Switch: once, now, restart state.

dSwitch :: Monad m => Wire s e m a (b, Event (Wire s e m a b)) -> Wire s e m a b Source

Intrinsic switch: Delayed version of `switch`

.

- Inhibits: like argument wire until switch, then like the new wire.
- Switch: once, after now, restart state.

## Intrinsic continuable

kSwitch :: (Monad m, Monoid s) => Wire s e m a b -> Wire s e m (a, b) (Event (Wire s e m a b -> Wire s e m a b)) -> Wire s e m a b Source

Intrinsic continuable switch: `kSwitch w1 w2`

starts with `w1`

.
Its signal is received by `w2`

, which may choose to switch to a new
wire. Passes the wire we are switching away from to the new wire,
such that it may be reused in it.

- Inhibits: like the first argument wire, like the new wire after switch. Inhibition of the second argument wire is ignored.
- Switch: once, now, restart state.

dkSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, b) (Event (Wire s e m a b -> Wire s e m a b)) -> Wire s e m a b Source

Intrinsic continuable switch: Delayed version of `kSwitch`

.

- Inhibits: like the first argument wire, like the new wire after switch. Inhibition of the second argument wire is ignored.
- Switch: once, after now, restart state.

## Extrinsic

rSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b)) b Source

Extrinsic switch: Start with the given wire. Each time the input event occurs, switch to the wire it carries.

- Inhibits: like the current wire.
- Switch: recurrent, now, restart state.

drSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b)) b Source

Extrinsic switch: Delayed version of `rSwitch`

.

- Inhibits: like the current wire.
- Switch: recurrent, after now, restart state.

alternate :: Monad m => Wire s e m a b -> Wire s e m a b -> Wire s e m (a, Event x) b Source

Acts like the first wire until an event occurs then switches to the second wire. Behaves like this wire until the event occurs at which point a *new* instance of the first wire is switched to.

- Depends: like current wire.
- Inhibits: like the argument wires.
- Switch: once, now, restart state.

## Extrinsic continuable

krSwitch :: Monad m => Wire s e m a b -> Wire s e m (a, Event (Wire s e m a b -> Wire s e m a b)) b Source

Extrinsic continuable switch. This switch works like `rSwitch`

,
except that it passes the wire we are switching away from to the new
wire.

- Inhibits: like the current wire.
- Switch: recurrent, now, restart state.