FRP.Behavior
- Package
- purescript-hyrule
- Repository
- mikesol/purescript-hyrule
#ABehavior Source
newtype ABehavior :: (Type -> Type) -> Type -> Type
newtype ABehavior event a
ABehavior
is the more general type of Behavior
, which is parameterized
over some underlying event
type.
Normally, you should use Behavior
instead, but this type
can also be used with other types of events, including the ones in the
Semantic
module.
Instances
(Functor event) => Functor (ABehavior event)
(Functor event) => Apply (ABehavior event)
(Functor event) => Applicative (ABehavior event)
(Functor event, Semigroup a) => Semigroup (ABehavior event a)
(Functor event, Monoid a) => Monoid (ABehavior event a)
(Functor event, HeytingAlgebra a) => HeytingAlgebra (ABehavior event a)
(Functor event, Semiring a) => Semiring (ABehavior event a)
(Functor event, Ring a) => Ring (ABehavior event a)
#gate Source
gate :: forall event a. Filterable event => ABehavior event Boolean -> event a -> event a
Filter an Event
by the boolean value of a Behavior
.
#gateBy Source
gateBy :: forall event p a. Filterable event => (p -> a -> Boolean) -> ABehavior event p -> event a -> event a
Sample a Behavior
on some Event
by providing a predicate function.
#integral Source
integral :: forall event a t. IsEvent event => Field t => Semiring a => (((a -> t) -> t) -> a) -> a -> ABehavior event t -> ABehavior event a -> ABehavior event a
Integrate with respect to some measure of time.
This function approximates the integral using the trapezium rule at the implicit sampling interval.
The Semiring
a
should be a vector field over the field t
. To represent
this, the user should provide a grate which lifts a multiplication
function on t
to a function on a
. Simple examples where t ~ a
can use
the integral'
function instead.
#integral' Source
integral' :: forall event t. IsEvent event => Field t => t -> ABehavior event t -> ABehavior event t -> ABehavior event t
Integrate with respect to some measure of time.
This function is a simpler version of integral
where the function being
integrated takes values in the same field used to represent time.
#derivative Source
derivative :: forall event a t. IsEvent event => Field t => Ring a => (((a -> t) -> t) -> a) -> ABehavior event t -> ABehavior event a -> ABehavior event a
Differentiate with respect to some measure of time.
This function approximates the derivative using a quotient of differences at the implicit sampling interval.
The Semiring
a
should be a vector field over the field t
. To represent
this, the user should provide a grate which lifts a division
function on t
to a function on a
. Simple examples where t ~ a
can use
the derivative'
function.
#derivative' Source
derivative' :: forall event t. IsEvent event => Field t => ABehavior event t -> ABehavior event t -> ABehavior event t
Differentiate with respect to some measure of time.
This function is a simpler version of derivative
where the function being
differentiated takes values in the same field used to represent time.
#solve Source
solve :: forall t a. Field t => Semiring a => (((a -> t) -> t) -> a) -> a -> Behavior t -> (Behavior a -> Behavior a) -> Behavior a
Solve a first order differential equation of the form
da/dt = f a
by integrating once (specifying the initial conditions).
For example, the exponential function with growth rate ⍺
:
exp = solve' 1.0 Time.seconds (⍺ * _)
#solve2 Source
solve2 :: forall t a. Field t => Semiring a => (((a -> t) -> t) -> a) -> a -> a -> Behavior t -> (Behavior a -> Behavior a -> Behavior a) -> Behavior a
Solve a second order differential equation of the form
d^2a/dt^2 = f a (da/dt)
by integrating twice (specifying the initial conditions).
For example, an (damped) oscillator:
oscillate = solve2' 1.0 0.0 Time.seconds (\x dx -> -⍺ * x - δ * dx)