{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS -fplugin=AsyncRattus.Plugin #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE CPP #-}
module AsyncRattus.Signal
( map
, mkInputSig
, getInputSig
, filterMap
, filterMapAwait
, filter
, filterAwait
, trigger
, triggerAwait
, mapAwait
, switch
, switchS
, switchAwait
, interleave
, mkSig
, mkBoxSig
, current
, future
, const
, scan
, scanAwait
, scanMap
, Sig(..)
, zipWith
, zipWith3
, zip
, cond
, integral
, derivative
)
where
import AsyncRattus
import AsyncRattus.Channels
import Prelude hiding (map, const, zipWith, zipWith3, zip, filter)
import Data.VectorSpace
import Data.Ratio ((%))
infixr 5 :::
data Sig a = !a ::: !(O (Sig a))
instance Producer (Sig a) a where
getCurrent :: Sig a -> Maybe' a
getCurrent Sig a
p = forall a. a -> Maybe' a
Just' (forall a. Sig a -> a
current Sig a
p)
getNext :: forall b. Sig a -> (forall q. Producer q a => O q -> b) -> b
getNext Sig a
p forall q. Producer q a => O q -> b
cb = forall q. Producer q a => O q -> b
cb (forall a. Sig a -> O (Sig a)
future Sig a
p)
newtype SigMaybe a = SigMaybe (Sig (Maybe' a))
instance Producer (SigMaybe a) a where
getCurrent :: SigMaybe a -> Maybe' a
getCurrent (SigMaybe Sig (Maybe' a)
p) = forall a. Sig a -> a
current Sig (Maybe' a)
p
getNext :: forall b. SigMaybe a -> (forall q. Producer q a => O q -> b) -> b
getNext (SigMaybe Sig (Maybe' a)
p) forall q. Producer q a => O q -> b
cb = forall q. Producer q a => O q -> b
cb (forall a. a -> O a
delay (forall a. Sig (Maybe' a) -> SigMaybe a
SigMaybe (forall a. O a -> a
adv (forall a. Sig a -> O (Sig a)
future Sig (Maybe' a)
p))))
{-# ANN module AsyncRattus #-}
current :: Sig a -> a
current :: forall a. Sig a -> a
current (a
x ::: O (Sig a)
_) = a
x
future :: Sig a -> O (Sig a)
future :: forall a. Sig a -> O (Sig a)
future (a
_ ::: O (Sig a)
xs) = O (Sig a)
xs
map :: Box (a -> b) -> Sig a -> Sig b
map :: forall a b. Box (a -> b) -> Sig a -> Sig b
map Box (a -> b)
f (a
x ::: O (Sig a)
xs) = forall a. Box a -> a
unbox Box (a -> b)
f a
x forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (forall a b. Box (a -> b) -> Sig a -> Sig b
map Box (a -> b)
f (forall a. O a -> a
adv O (Sig a)
xs))
getInputSig :: IO (Box (O (Sig a)) :* (a -> IO ()))
getInputSig :: forall a. IO (Box (O (Sig a)) :* (a -> IO ()))
getInputSig = do (Box (O a)
s :* a -> IO ()
cb) <- forall a. IO (Box (O a) :* (a -> IO ()))
getInput
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Box (O a) -> Box (O (Sig a))
mkBoxSig Box (O a)
s forall a b. a -> b -> a :* b
:* a -> IO ()
cb)
mkInputSig :: Producer p a => p -> IO (Box (O (Sig a)))
mkInputSig :: forall p a. Producer p a => p -> IO (Box (O (Sig a)))
mkInputSig p
p = forall a. Box (O a) -> Box (O (Sig a))
mkBoxSig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall p a. Producer p a => p -> IO (Box (O a))
mkInput p
p
filterMap :: Box (a -> Maybe' b) -> Sig a -> IO (Box (O (Sig b)))
filterMap :: forall a b. Box (a -> Maybe' b) -> Sig a -> IO (Box (O (Sig b)))
filterMap Box (a -> Maybe' b)
f Sig a
s = forall p a. Producer p a => p -> IO (Box (O (Sig a)))
mkInputSig (forall a. Sig (Maybe' a) -> SigMaybe a
SigMaybe (forall a b. Box (a -> b) -> Sig a -> Sig b
map Box (a -> Maybe' b)
f Sig a
s))
filterMapAwait :: Box (a -> Maybe' b) -> O (Sig a) -> IO (Box (O (Sig b)))
filterMapAwait :: forall a b.
Box (a -> Maybe' b) -> O (Sig a) -> IO (Box (O (Sig b)))
filterMapAwait Box (a -> Maybe' b)
f O (Sig a)
s = forall p a. Producer p a => p -> IO (Box (O (Sig a)))
mkInputSig (forall a. a -> O a
delay (forall a. Sig (Maybe' a) -> SigMaybe a
SigMaybe (forall a b. Box (a -> b) -> Sig a -> Sig b
map Box (a -> Maybe' b)
f (forall a. O a -> a
adv O (Sig a)
s))))
filter :: Box (a -> Bool) -> Sig a -> IO (Box (O (Sig a)))
filter :: forall a. Box (a -> Bool) -> Sig a -> IO (Box (O (Sig a)))
filter Box (a -> Bool)
p = forall a b. Box (a -> Maybe' b) -> Sig a -> IO (Box (O (Sig b)))
filterMap (forall a. a -> Box a
box (\ a
x -> if forall a. Box a -> a
unbox Box (a -> Bool)
p a
x then forall a. a -> Maybe' a
Just' a
x else forall a. Maybe' a
Nothing'))
filterAwait :: Box (a -> Bool) -> O (Sig a) -> IO (Box (O (Sig a)))
filterAwait :: forall a. Box (a -> Bool) -> O (Sig a) -> IO (Box (O (Sig a)))
filterAwait Box (a -> Bool)
p = forall a b.
Box (a -> Maybe' b) -> O (Sig a) -> IO (Box (O (Sig b)))
filterMapAwait (forall a. a -> Box a
box (\ a
x -> if forall a. Box a -> a
unbox Box (a -> Bool)
p a
x then forall a. a -> Maybe' a
Just' a
x else forall a. Maybe' a
Nothing'))
trigger :: (Stable a, Stable b) => Box (a -> b -> c) -> Sig a -> Sig b -> IO (Box (Sig c))
trigger :: forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> IO (Box (Sig c))
trigger Box (a -> b -> c)
f (a
a ::: O (Sig a)
as) bs :: Sig b
bs@(b
b:::O (Sig b)
_) = do Box (O (Sig c))
s <- forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> IO (Box (O (Sig c)))
triggerAwait Box (a -> b -> c)
f O (Sig a)
as Sig b
bs
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Box a
box (forall a. Box a -> a
unbox Box (a -> b -> c)
f a
a b
b forall a. a -> O (Sig a) -> Sig a
::: forall a. Box a -> a
unbox Box (O (Sig c))
s))
triggerAwait :: Stable b => Box (a -> b -> c) -> O (Sig a) -> Sig b -> IO (Box (O (Sig c)))
triggerAwait :: forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> IO (Box (O (Sig c)))
triggerAwait Box (a -> b -> c)
f O (Sig a)
as Sig b
bs = forall a. Box (O a) -> Box (O (Sig a))
mkBoxSig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall p a. Producer p a => p -> IO (Box (O a))
mkInput (forall a. a -> Box a
box forall a. Sig (Maybe' a) -> SigMaybe a
SigMaybe forall a b. Box (a -> b) -> O a -> O b
`mapO` (forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig Box (a -> b -> c)
f O (Sig a)
as Sig b
bs)) where
trig :: Stable b => Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig :: forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig Box (a -> b -> c)
f O (Sig a)
as (b
b ::: O (Sig b)
bs) =
forall a. a -> O a
delay (case forall a b. O a -> O b -> Select a b
select O (Sig a)
as O (Sig b)
bs of
Fst (a
a' ::: O (Sig a)
as') O (Sig b)
bs' -> forall a. a -> Maybe' a
Just' (forall a. Box a -> a
unbox Box (a -> b -> c)
f a
a' b
b) forall a. a -> O (Sig a) -> Sig a
::: forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig Box (a -> b -> c)
f O (Sig a)
as' (b
b forall a. a -> O (Sig a) -> Sig a
::: O (Sig b)
bs')
Snd O (Sig a)
as' Sig b
bs' -> forall a. Maybe' a
Nothing' forall a. a -> O (Sig a) -> Sig a
::: forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig Box (a -> b -> c)
f O (Sig a)
as' Sig b
bs'
Both (a
a' ::: O (Sig a)
as') (b
b' ::: O (Sig b)
bs') -> forall a. a -> Maybe' a
Just' (forall a. Box a -> a
unbox Box (a -> b -> c)
f a
a' b
b') forall a. a -> O (Sig a) -> Sig a
::: forall b a c.
Stable b =>
Box (a -> b -> c) -> O (Sig a) -> Sig b -> O (Sig (Maybe' c))
trig Box (a -> b -> c)
f O (Sig a)
as' (b
b' forall a. a -> O (Sig a) -> Sig a
::: O (Sig b)
bs')
)
mapAwait :: Box (a -> b) -> O (Sig a) -> O (Sig b)
mapAwait :: forall a b. Box (a -> b) -> O (Sig a) -> O (Sig b)
mapAwait Box (a -> b)
f O (Sig a)
d = forall a. a -> O a
delay (forall a b. Box (a -> b) -> Sig a -> Sig b
map Box (a -> b)
f (forall a. O a -> a
adv O (Sig a)
d))
mkSig :: Box (O a) -> O (Sig a)
mkSig :: forall a. Box (O a) -> O (Sig a)
mkSig Box (O a)
b = forall a. a -> O a
delay (forall a. O a -> a
adv (forall a. Box a -> a
unbox Box (O a)
b) forall a. a -> O (Sig a) -> Sig a
::: forall a. Box (O a) -> O (Sig a)
mkSig Box (O a)
b)
mkBoxSig :: Box (O a) -> Box (O (Sig a))
mkBoxSig :: forall a. Box (O a) -> Box (O (Sig a))
mkBoxSig Box (O a)
b = forall a. a -> Box a
box (forall a. Box (O a) -> O (Sig a)
mkSig Box (O a)
b)
const :: a -> Sig a
const :: forall a. a -> Sig a
const a
x = a
x forall a. a -> O (Sig a) -> Sig a
::: forall a. O a
never
scan :: (Stable b) => Box(b -> a -> b) -> b -> Sig a -> Sig b
scan :: forall b a. Stable b => Box (b -> a -> b) -> b -> Sig a -> Sig b
scan Box (b -> a -> b)
f b
acc (a
a ::: O (Sig a)
as) = b
acc' forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (forall b a. Stable b => Box (b -> a -> b) -> b -> Sig a -> Sig b
scan Box (b -> a -> b)
f b
acc' (forall a. O a -> a
adv O (Sig a)
as))
where acc' :: b
acc' = forall a. Box a -> a
unbox Box (b -> a -> b)
f b
acc a
a
scanAwait :: (Stable b) => Box (b -> a -> b) -> b -> O (Sig a) -> Sig b
scanAwait :: forall b a.
Stable b =>
Box (b -> a -> b) -> b -> O (Sig a) -> Sig b
scanAwait Box (b -> a -> b)
f b
acc O (Sig a)
as = b
acc forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (forall b a. Stable b => Box (b -> a -> b) -> b -> Sig a -> Sig b
scan Box (b -> a -> b)
f b
acc (forall a. O a -> a
adv O (Sig a)
as))
scanMap :: (Stable b) => Box (b -> a -> b) -> Box (b -> c) -> b -> Sig a -> Sig c
scanMap :: forall b a c.
Stable b =>
Box (b -> a -> b) -> Box (b -> c) -> b -> Sig a -> Sig c
scanMap Box (b -> a -> b)
f Box (b -> c)
p b
acc (a
a ::: O (Sig a)
as) = forall a. Box a -> a
unbox Box (b -> c)
p b
acc' forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (forall b a c.
Stable b =>
Box (b -> a -> b) -> Box (b -> c) -> b -> Sig a -> Sig c
scanMap Box (b -> a -> b)
f Box (b -> c)
p b
acc' (forall a. O a -> a
adv O (Sig a)
as))
where acc' :: b
acc' = forall a. Box a -> a
unbox Box (b -> a -> b)
f b
acc a
a
switch :: Sig a -> O (Sig a) -> Sig a
switch :: forall a. Sig a -> O (Sig a) -> Sig a
switch (a
x ::: O (Sig a)
xs) O (Sig a)
d = a
x forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (case forall a b. O a -> O b -> Select a b
select O (Sig a)
xs O (Sig a)
d of
Fst Sig a
xs' O (Sig a)
d' -> forall a. Sig a -> O (Sig a) -> Sig a
switch Sig a
xs' O (Sig a)
d'
Snd O (Sig a)
_ Sig a
d' -> Sig a
d'
Both Sig a
_ Sig a
d' -> Sig a
d')
switchS :: Stable a => Sig a -> O (a -> Sig a) -> Sig a
switchS :: forall a. Stable a => Sig a -> O (a -> Sig a) -> Sig a
switchS (a
x ::: O (Sig a)
xs) O (a -> Sig a)
d = a
x forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (case forall a b. O a -> O b -> Select a b
select O (Sig a)
xs O (a -> Sig a)
d of
Fst Sig a
xs' O (a -> Sig a)
d' -> forall a. Stable a => Sig a -> O (a -> Sig a) -> Sig a
switchS Sig a
xs' O (a -> Sig a)
d'
Snd O (Sig a)
_ a -> Sig a
f -> a -> Sig a
f a
x
Both Sig a
_ a -> Sig a
f -> a -> Sig a
f a
x)
switchAwait :: O (Sig a) -> O (Sig a) -> O (Sig a)
switchAwait :: forall a. O (Sig a) -> O (Sig a) -> O (Sig a)
switchAwait O (Sig a)
xs O (Sig a)
ys = forall a. a -> O a
delay (case forall a b. O a -> O b -> Select a b
select O (Sig a)
xs O (Sig a)
ys of
Fst Sig a
xs' O (Sig a)
d' -> forall a. Sig a -> O (Sig a) -> Sig a
switch Sig a
xs' O (Sig a)
d'
Snd O (Sig a)
_ Sig a
d' -> Sig a
d'
Both Sig a
_ Sig a
d' -> Sig a
d')
interleave :: Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
interleave :: forall a. Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
interleave Box (a -> a -> a)
f O (Sig a)
xs O (Sig a)
ys = forall a. a -> O a
delay (case forall a b. O a -> O b -> Select a b
select O (Sig a)
xs O (Sig a)
ys of
Fst (a
x ::: O (Sig a)
xs') O (Sig a)
ys' -> a
x forall a. a -> O (Sig a) -> Sig a
::: forall a. Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
interleave Box (a -> a -> a)
f O (Sig a)
xs' O (Sig a)
ys'
Snd O (Sig a)
xs' (a
y ::: O (Sig a)
ys') -> a
y forall a. a -> O (Sig a) -> Sig a
::: forall a. Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
interleave Box (a -> a -> a)
f O (Sig a)
xs' O (Sig a)
ys'
Both (a
x ::: O (Sig a)
xs') (a
y ::: O (Sig a)
ys') -> forall a. Box a -> a
unbox Box (a -> a -> a)
f a
x a
y forall a. a -> O (Sig a) -> Sig a
::: forall a. Box (a -> a -> a) -> O (Sig a) -> O (Sig a) -> O (Sig a)
interleave Box (a -> a -> a)
f O (Sig a)
xs' O (Sig a)
ys')
zipWith :: (Stable a, Stable b) => Box(a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith :: forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith Box (a -> b -> c)
f (a
a ::: O (Sig a)
as) (b
b ::: O (Sig b)
bs) = forall a. Box a -> a
unbox Box (a -> b -> c)
f a
a b
b forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (
case forall a b. O a -> O b -> Select a b
select O (Sig a)
as O (Sig b)
bs of
Fst Sig a
as' O (Sig b)
lbs -> forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith Box (a -> b -> c)
f Sig a
as' (b
b forall a. a -> O (Sig a) -> Sig a
::: O (Sig b)
lbs)
Snd O (Sig a)
las Sig b
bs' -> forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith Box (a -> b -> c)
f (a
a forall a. a -> O (Sig a) -> Sig a
::: O (Sig a)
las) Sig b
bs'
Both Sig a
as' Sig b
bs' -> forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith Box (a -> b -> c)
f Sig a
as' Sig b
bs'
)
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
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
zipWith3 Box (a -> b -> c -> d)
f Sig a
as Sig b
bs Sig c
cs = forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith (forall a. a -> Box a
box (\Box (c -> d)
f c
x -> forall a. Box a -> a
unbox Box (c -> d)
f c
x)) Sig (Box (c -> d))
cds Sig c
cs
where cds :: Sig (Box (c -> d))
cds :: Sig (Box (c -> d))
cds = forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith (forall a. a -> Box a
box (\a
a b
b -> forall a. a -> Box a
box (\ c
c -> forall a. Box a -> a
unbox Box (a -> b -> c -> d)
f a
a b
b c
c))) Sig a
as Sig b
bs
cond :: Stable a => Sig Bool -> Sig a -> Sig a -> Sig a
cond :: forall a. Stable a => Sig Bool -> Sig a -> Sig a -> Sig a
cond = forall a b c d.
(Stable a, Stable b, Stable c) =>
Box (a -> b -> c -> d) -> Sig a -> Sig b -> Sig c -> Sig d
zipWith3 (forall a. a -> Box a
box (\Bool
b a
x a
y -> if Bool
b then a
x else a
y))
zip :: (Stable a, Stable b) => Sig a -> Sig b -> Sig (a:*b)
zip :: forall a b. (Stable a, Stable b) => Sig a -> Sig b -> Sig (a :* b)
zip = forall a b c.
(Stable a, Stable b) =>
Box (a -> b -> c) -> Sig a -> Sig b -> Sig c
zipWith (forall a. a -> Box a
box forall a b. a -> b -> a :* b
(:*))
dt :: Int
dt :: Int
dt = Int
20000
integral :: forall a v . (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a)
=> v -> Sig v -> Sig v
integral :: forall a v.
(VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) =>
v -> Sig v -> Sig v
integral = v -> Sig v -> Sig v
int
where int :: v -> Sig v -> Sig v
int v
cur (v
x ::: O (Sig v)
xs)
| v
x forall a. Eq a => a -> a -> Bool
== forall v a. VectorSpace v a => v
zeroVector = v
cur forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (v -> Sig v -> Sig v
int v
cur (forall a. O a -> a
adv O (Sig v)
xs))
| Bool
otherwise = v
cur forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (
case forall a b. O a -> O b -> Select a b
select O (Sig v)
xs (forall a. Box a -> a
unbox (Int -> Box (O ())
timer Int
dt)) of
Fst Sig v
xs' O ()
_ -> v -> Sig v -> Sig v
int v
cur Sig v
xs'
Snd O (Sig v)
xs' () -> v -> Sig v -> Sig v
int (a
dtf forall v a. VectorSpace v a => a -> v -> v
*^ (v
cur forall v a. VectorSpace v a => v -> v -> v
^+^ v
x)) (v
x forall a. a -> O (Sig a) -> Sig a
::: O (Sig v)
xs')
Both (v
x' ::: O (Sig v)
xs') () -> v -> Sig v -> Sig v
int (a
dtf forall v a. VectorSpace v a => a -> v -> v
*^ (v
cur forall v a. VectorSpace v a => v -> v -> v
^+^ v
x')) (v
x'forall a. a -> O (Sig a) -> Sig a
::: O (Sig v)
xs'))
dtf :: a
dtf :: a
dtf = forall a. Fractional a => Rational -> a
fromRational (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
dt forall a. Integral a => a -> a -> Ratio a
% Integer
1000000)
derivative :: forall a v . (VectorSpace v a, Eq v, Fractional a, Stable v, Stable a)
=> Sig v -> Sig v
derivative :: forall a v.
(VectorSpace v a, Eq v, Fractional a, Stable v, Stable a) =>
Sig v -> Sig v
derivative Sig v
xs = v -> v -> Sig v -> Sig v
der forall v a. VectorSpace v a => v
zeroVector (forall a. Sig a -> a
current Sig v
xs) Sig v
xs where
dtf :: a
dtf :: a
dtf = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
dt forall a. Num a => a -> a -> a
* a
0.000001
der :: v -> v -> Sig v -> Sig v
der :: v -> v -> Sig v -> Sig v
der v
d v
last (v
x:::O (Sig v)
xs)
| v
d forall a. Eq a => a -> a -> Bool
== forall v a. VectorSpace v a => v
zeroVector = forall v a. VectorSpace v a => v
zeroVector forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay
(let v
x' ::: O (Sig v)
xs' = forall a. O a -> a
adv O (Sig v)
xs
in v -> v -> Sig v -> Sig v
der ((v
x' forall v a. VectorSpace v a => v -> v -> v
^-^ v
x) forall v a. VectorSpace v a => v -> a -> v
^/ a
dtf) v
x (v
x' forall a. a -> O (Sig a) -> Sig a
::: O (Sig v)
xs'))
| Bool
otherwise = v
d forall a. a -> O (Sig a) -> Sig a
::: forall a. a -> O a
delay (
case forall a b. O a -> O b -> Select a b
select O (Sig v)
xs (forall a. Box a -> a
unbox (Int -> Box (O ())
timer Int
dt)) of
Fst Sig v
xs' O ()
_ -> v -> v -> Sig v -> Sig v
der v
d v
last Sig v
xs'
Snd O (Sig v)
xs' () -> v -> v -> Sig v -> Sig v
der ((v
x forall v a. VectorSpace v a => v -> v -> v
^-^ v
last) forall v a. VectorSpace v a => v -> a -> v
^/ a
dtf) v
x (v
x forall a. a -> O (Sig a) -> Sig a
::: O (Sig v)
xs')
Both (v
x' ::: O (Sig v)
xs') () -> v -> v -> Sig v -> Sig v
der ((v
x' forall v a. VectorSpace v a => v -> v -> v
^-^ v
last) forall v a. VectorSpace v a => v -> a -> v
^/ a
dtf) v
x' (v
x' forall a. a -> O (Sig a) -> Sig a
::: O (Sig v)
xs'))
{-# NOINLINE [1] map #-}
{-# NOINLINE [1] const #-}
{-# NOINLINE [1] scan #-}
{-# NOINLINE [1] scanMap #-}
{-# NOINLINE [1] zip #-}
{-# RULES
"const/map" forall (f :: Stable b => Box (a -> b)) x.
map f (const x) = let x' = unbox f x in const x' ;
"map/map" forall f g xs.
map f (map g xs) = map (box (unbox f . unbox g)) xs ;
"map/scan" forall f p acc as.
map p (scan f acc as) = scanMap f p acc as ;
"zip/map" forall xs ys f.
map f (zip xs ys) = let f' = unbox f in zipWith (box (\ x y -> f' (x :* y))) xs ys;
"scan/scan" forall f g b c as.
scan g c (scan f b as) =
let f' = unbox f; g' = unbox g in
scanMap (box (\ (b:*c) a -> let b' = f' b a in (b':* g' c b'))) (box snd') (b:*c) as ;
"scan/scanMap" forall f g p b c as.
scan g c (scanMap f p b as) =
let f' = unbox f; g' = unbox g; p' = unbox p in
scanMap (box (\ (b:*c) a -> let b' = f' (p' b) a in (b':* g' c b'))) (box snd') (b:*c) as ;
#-}