Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
AsyncRattus.Signal
Description
Programming with signals.
Synopsis
- data Sig a = !a ::: !(O (Sig a))
- map :: Box (a -> b) -> Sig a -> Sig b
- mkInputSig :: Producer p a => p -> IO (Box (O (Sig a)))
- getInputSig :: IO (Box (O (Sig a)) :* (a -> IO ()))
- filterMap :: Box (a -> Maybe' b) -> Sig a -> IO (Box (O (Sig b)))
- filterMapAwait :: Box (a -> Maybe' b) -> O (Sig a) -> IO (Box (O (Sig b)))
- filter :: Box (a -> Bool) -> Sig a -> IO (Box (O (Sig a)))
- filterAwait :: Box (a -> Bool) -> O (Sig a) -> IO (Box (O (Sig a)))
- trigger :: (Stable a, Stable b) => Box (a -> b -> c) -> Sig a -> Sig b -> IO (Box (Sig c))
- triggerAwait :: Stable b => Box (a -> b -> c) -> O (Sig a) -> Sig b -> IO (Box (O (Sig c)))
- mapAwait :: Box (a -> b) -> O (Sig a) -> O (Sig b)
- switch :: Sig a -> O (Sig a) -> Sig a
- switchS :: Stable a => Sig a -> O (a -> Sig a) -> Sig a
- switchAwait :: O (Sig a) -> O (Sig a) -> O (Sig a)
- switchR :: Stable a => Sig a -> O (Sig (a -> Sig a)) -> Sig a
- interleave :: Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
- mapInterleave :: Box (a -> a) -> Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
- interleaveAll :: Box (a -> a -> a) -> List (O (Sig a)) -> O (Sig a)
- update :: Stable a => Sig a -> O (Sig (a -> a)) -> Sig a
- mkSig :: Box (O a) -> O (Sig a)
- mkBoxSig :: Box (O a) -> Box (O (Sig a))
- current :: Sig a -> a
- future :: Sig a -> O (Sig a)
- const :: a -> Sig a
- scan :: Stable b => Box (b -> a -> b) -> b -> Sig a -> Sig b
- scanAwait :: Stable b => Box (b -> a -> b) -> b -> O (Sig a) -> Sig b
- scanMap :: Stable b => Box (b -> a -> b) -> Box (b -> c) -> b -> Sig a -> Sig c
- jump :: Box (a -> Maybe' (Sig a)) -> Sig a -> Sig a
- jumping :: Box (a -> Maybe' (Sig a)) -> Sig a -> Sig a
- stop :: Box (a -> Bool) -> Sig a -> Sig a
- zipWith :: (Stable a, Stable b) => Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
- zipWith3 :: forall a b c d. (Stable a, Stable b, Stable c) => Box (a -> b -> c -> d) -> Sig a -> Sig b -> Sig c -> Sig d
- zip :: (Stable a, Stable b) => Sig a -> Sig b -> Sig (a :* b)
- parallelWith :: Box (Maybe' a -> Maybe' b -> c) -> Sig a -> Sig b -> Sig c
- parallelWithAwait :: Box (Maybe' a -> Maybe' b -> c) -> O (Sig a) -> O (Sig b) -> O (Sig c)
- parallel :: Sig a -> Sig b -> Sig (Maybe' a :* Maybe' b)
- parallelAwait :: O (Sig a) -> O (Sig b) -> O (Sig (Maybe' a :* Maybe' b))
- cond :: Stable a => Sig Bool -> Sig a -> Sig a -> Sig a
- buffer :: Stable a => a -> Sig a -> Sig a
- bufferAwait :: Stable a => a -> O (Sig a) -> O (Sig a)
- integral :: forall a v. (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) => v -> Sig v -> Sig v
- derivative :: forall a v. (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) => Sig v -> Sig v
Documentation
Sig a
is a stream of values of type a
.
mkInputSig :: Producer p a => p -> IO (Box (O (Sig a))) Source #
Turn a producer into a signal. This is a variant of mkInput
that returns a signal instead of a boxed delayed computation.
getInputSig :: IO (Box (O (Sig a)) :* (a -> IO ())) Source #
Variant of getInput
that returns a signal instead of a boxed
delayed computation.
filterMapAwait :: Box (a -> Maybe' b) -> O (Sig a) -> IO (Box (O (Sig b))) Source #
This function is similar to filterMap
but takes a delayed
signal (type O (Sig a)
) as an argument instead of a signal (Sig
a
).
filter :: Box (a -> Bool) -> Sig a -> IO (Box (O (Sig a))) Source #
Filter the given signal using a predicate. The signal produced by
filter p s
contains only values from s
that satisfy the
predicate p
.
filterAwait :: Box (a -> Bool) -> O (Sig a) -> IO (Box (O (Sig a))) Source #
This function is similar to filter
but takes a delayed signal
(type O (Sig a)
) as an argument instead of a signal (Sig a
).
trigger :: (Stable a, Stable b) => Box (a -> b -> c) -> Sig a -> Sig b -> IO (Box (Sig c)) Source #
This function is a variant of zipWith
. Whereas zipWith f xs
ys
produces a new value whenever xs
or ys
produce a new value,
trigger f xs ys
only produces a new value when xs produces a new
value.
Example:
xs: 1 0 5 2 ys: 1 2 3 2 zipWith (box (+)) xs ys: 2 3 4 3 8 4 trigger (box (+)) xy ys: 2 3 8 4
triggerAwait :: Stable b => Box (a -> b -> c) -> O (Sig a) -> Sig b -> IO (Box (O (Sig c))) Source #
This function is similar to trigger
but takes a delayed signal
(type O (Sig a)
) as an argument instead of a signal (Sig a
).
Example:
xs: 1 0 5 2 ys: 1 2 3 2 trigger (box (+)) xy ys: 2 3 8 4
switch :: Sig a -> O (Sig a) -> Sig a Source #
This function allows to switch from one signal to another one
dynamically. The signal defined by switch xs ys
first behaves
like xs
, but as soon as ys
produces a new value, switch xs ys
behaves like ys
.
Example:
xs: 1 2 3 4 5 6 7 8 9 ys: 1 2 3 4 5 6 switch xs ys: 1 2 3 1 2 3 4 5 6
switchS :: Stable a => Sig a -> O (a -> Sig a) -> Sig a Source #
This function is similar to switch
, but the (future) second
signal may depend on the last value of the first signal.
switchAwait :: O (Sig a) -> O (Sig a) -> O (Sig a) Source #
This function is similar to switch
but works on delayed signals
instead of signals.
switchR :: Stable a => Sig a -> O (Sig (a -> Sig a)) -> Sig a Source #
Variant of switchS
that repeatedly switches. The output signal
switch xs ys
first behaves like xs
, but whenever ys
produces
a value f
, the signal switches to f v
where v
is the previous
value of the output signal.
switchS
can be considered a special case of switchR
that only
makes a single switch. That is we have the following:
switchS xs ys = switchR (delay (const (adv xs))) ys
interleave :: Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a) Source #
This function interleaves two signals producing a new value v
whenever either input stream produces a new value v
. In case the
input signals produce a new value simultaneously, the function
argument is used break ties, i.e. to compute the new output value based
on the two new input values
Example:
xs: 1 3 5 3 1 3 ys: 0 2 4 interleave (box (+)) xs ys: 1 3 2 5 7 1 3
mapInterleave :: Box (a -> a) -> Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a) Source #
This is the composition of mapAwait
and interleave
. That is,
mapInterleave f g xs ys = mapAwait f (interleave xs ys)
update :: Stable a => Sig a -> O (Sig (a -> a)) -> Sig a Source #
Takes two signals and updates the first signal using the functions produced by the second signal:
Law:
(xs `update` fs) `update` gs = (xs `update` (interleave (box (.)) gs fs))
mkBoxSig :: Box (O a) -> Box (O (Sig a)) Source #
Variant of mkSig
that returns a boxed delayed signal
scanAwait :: Stable b => Box (b -> a -> b) -> b -> O (Sig a) -> Sig b Source #
Like scan
, but uses a delayed signal.
jump :: Box (a -> Maybe' (Sig a)) -> Sig a -> Sig a Source #
jump (box f) xs
first behaves like xs
, but as soon as f x =
Just xs'
for a (current or future) value x
of xs
, it behaves
like xs'
.
jumping :: Box (a -> Maybe' (Sig a)) -> Sig a -> Sig a Source #
Similar to jump
, but it can jump repeatedly. That is, jumping
(box f) xs
first behaves like xs
, but every time f x = Just
xs'
for a (current or future) value x
of jumping (box f) xs
,
it behaves like xs'
.
stop :: Box (a -> Bool) -> Sig a -> Sig a Source #
Stops as soon as the the predicate becomes true for the current
value. That is, stop (box p) xs
first behaves as xs
, but as
soon as f x = True
for some (current or future) value x
of
xs
, then it behaves as const x
.
zipWith :: (Stable a, Stable b) => Box (a -> b -> c) -> Sig a -> Sig b -> Sig c Source #
This function is a variant of combines the values of two signals
using the function argument. zipWith f xs ys
produces a new value
unbox f x y
whenever xs
or ys
produce a new value, where x
and y
are the current values of xs
and ys
, respectively.
Example:
xs: 1 2 3 2 ys: 1 0 5 2 zipWith (box (+)) xs ys: 2 3 4 3 8 4
zipWith3 :: forall a b c d. (Stable a, Stable b, Stable c) => Box (a -> b -> c -> d) -> Sig a -> Sig b -> Sig c -> Sig d Source #
Variant of zipWith
with three signals.
zip :: (Stable a, Stable b) => Sig a -> Sig b -> Sig (a :* b) Source #
This is a special case of zipWith
using the tupling
function. That is,
zip = zipWith (box (:*))
parallelWith :: Box (Maybe' a -> Maybe' b -> c) -> Sig a -> Sig b -> Sig c Source #
This is a variant of zipWith
, but the values passed to the
function may not exist if the corresponding source signal has not
ticked.
Example:
xs: 1 2 3 ys: 1 0 5 parallelWith (box (:*)) xs ys: (J 1 :* J 1) (J 2 :* N) (J 3 :* J 0) (N :* J 5)
parallelWithAwait :: Box (Maybe' a -> Maybe' b -> c) -> O (Sig a) -> O (Sig b) -> O (Sig c) Source #
This is a variant of parallelWith
for delayed signals.
Example:
xs: 2 3 ys: 0 5 paralle (box (:*)) xs ys: (J 2 :* N) (J 3 :* J 0) (N :* J 5)
parallel :: Sig a -> Sig b -> Sig (Maybe' a :* Maybe' b) Source #
This is a variant of zip
, but the signal of pairs only contain
values if the corresponding source signal ticked.
Example:
xs: 1 2 3 ys: 1 0 5 parallel xs ys: (J 1 :* J 1) (J 2 :* N) (J 3 :* J 0) (N :* J 5)
parallelAwait :: O (Sig a) -> O (Sig b) -> O (Sig (Maybe' a :* Maybe' b)) Source #
This is a variant of parallel
for delayed signals.
Example:
xs: 2 3 ys: 0 5 parallel xs ys: (J 2 :* N) (J 3 :* J 0) (N :* J 5)
cond :: Stable a => Sig Bool -> Sig a -> Sig a -> Sig a Source #
If-then-else lifted to signals. cond bs xs ys
produces a stream
whose value is taken from xs
whenever bs
is true and from ys
otherwise.
integral :: forall a v. (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) => v -> Sig v -> Sig v Source #
integral x xs
computes the integral of the signal xs
with the
constant x
. For example, if xs
is the velocity of an object,
the signal integral 0 xs
describes the distance travelled by that
object.
derivative :: forall a v. (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) => Sig v -> Sig v Source #
Compute the derivative of a signal. For example, if xs
is the
velocity of an object, the signal derivative xs
describes the
acceleration travelled by that object.