module FRP.Yampa.Stream where
import FRP.Yampa (DTime, FutureSF, SF, evalAt, evalAtZero)
type SignalSampleStream a = (a, FutureSampleStream a)
type FutureSampleStream a = [(DTime, a)]
groupDeltas :: [a] -> [DTime] -> SignalSampleStream a
groupDeltas :: forall a. [a] -> [DTime] -> SignalSampleStream a
groupDeltas (a
x:[a]
xs) [DTime]
ds = (a
x, forall a b. [a] -> [b] -> [(a, b)]
zip [DTime]
ds [a]
xs)
groupDeltas [a]
xs [DTime]
ds =
forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"groupDeltas: called me with lists with lengths"
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs) forall a. [a] -> [a] -> [a]
++ [Char]
" and " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show (forall (t :: * -> *) a. Foldable t => t a -> Int
length [DTime]
ds)
samples :: SignalSampleStream a -> [a]
samples :: forall a. SignalSampleStream a -> [a]
samples (a
a, FutureSampleStream a
as) = a
a forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd FutureSampleStream a
as
firstSample :: SignalSampleStream a -> a
firstSample :: forall a. SignalSampleStream a -> a
firstSample = forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignalSampleStream a -> [a]
samples
lastSample :: SignalSampleStream a -> a
lastSample :: forall a. SignalSampleStream a -> a
lastSample = forall a. [a] -> a
last forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignalSampleStream a -> [a]
samples
sMerge :: (a -> a -> a)
-> SignalSampleStream a
-> SignalSampleStream a
-> SignalSampleStream a
sMerge :: forall a.
(a -> a -> a)
-> SignalSampleStream a
-> SignalSampleStream a
-> SignalSampleStream a
sMerge a -> a -> a
f (a
x1, FutureSampleStream a
xs1) (a
x2, FutureSampleStream a
xs2) = (a -> a -> a
f a
x1 a
x2, forall a.
(a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail a -> a -> a
f FutureSampleStream a
xs1 FutureSampleStream a
xs2)
where
sMergeTail :: (a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail :: forall a.
(a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail a -> a -> a
f [] [(DTime, a)]
xs2 = [(DTime, a)]
xs2
sMergeTail a -> a -> a
f [(DTime, a)]
xs1 [] = [(DTime, a)]
xs1
sMergeTail a -> a -> a
f ((DTime
dt1, a
x1) : [(DTime, a)]
xs1) ((DTime
dt2, a
x2) : [(DTime, a)]
xs2)
| DTime
dt1 forall a. Eq a => a -> a -> Bool
== DTime
dt2 = (DTime
dt1, a -> a -> a
f a
x1 a
x2) forall a. a -> [a] -> [a]
: forall a.
(a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail a -> a -> a
f [(DTime, a)]
xs1 [(DTime, a)]
xs2
| DTime
dt1 forall a. Ord a => a -> a -> Bool
< DTime
dt2 = (DTime
dt1, a
x1) forall a. a -> [a] -> [a]
: forall a.
(a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail a -> a -> a
f [(DTime, a)]
xs1 ((DTime
dt2 forall a. Num a => a -> a -> a
- DTime
dt1, a
x2) forall a. a -> [a] -> [a]
: [(DTime, a)]
xs2)
| Bool
otherwise = (DTime
dt2, a
x2) forall a. a -> [a] -> [a]
: forall a.
(a -> a -> a)
-> FutureSampleStream a
-> FutureSampleStream a
-> FutureSampleStream a
sMergeTail a -> a -> a
f ((DTime
dt1 forall a. Num a => a -> a -> a
- DTime
dt2, a
x1) forall a. a -> [a] -> [a]
: [(DTime, a)]
xs1) [(DTime, a)]
xs2
sConcat :: SignalSampleStream a
-> DTime
-> SignalSampleStream a
-> SignalSampleStream a
sConcat :: forall a.
SignalSampleStream a
-> DTime -> SignalSampleStream a -> SignalSampleStream a
sConcat (a
x1, FutureSampleStream a
xs1) DTime
dt (a
x2, FutureSampleStream a
xs2) = (a
x1, FutureSampleStream a
xs1 forall a. [a] -> [a] -> [a]
++ ((DTime
dt, a
x2) forall a. a -> [a] -> [a]
: FutureSampleStream a
xs2))
sRefine :: DTime -> SignalSampleStream a -> SignalSampleStream a
sRefine :: forall a. DTime -> SignalSampleStream a -> SignalSampleStream a
sRefine DTime
maxDT (a
a, FutureSampleStream a
as) = (a
a, forall a.
DTime -> a -> FutureSampleStream a -> FutureSampleStream a
sRefineFutureStream DTime
maxDT a
a FutureSampleStream a
as)
where
sRefineFutureStream :: DTime
-> a
-> FutureSampleStream a
-> FutureSampleStream a
sRefineFutureStream :: forall a.
DTime -> a -> FutureSampleStream a -> FutureSampleStream a
sRefineFutureStream DTime
maxDT a
_ [] = []
sRefineFutureStream DTime
maxDT a
a0 ((DTime
dt, a
a) : [(DTime, a)]
as)
| DTime
dt forall a. Ord a => a -> a -> Bool
> DTime
maxDT =
(DTime
maxDT, a
a0) forall a. a -> [a] -> [a]
: forall a.
DTime -> a -> FutureSampleStream a -> FutureSampleStream a
sRefineFutureStream DTime
maxDT a
a0 ((DTime
dt forall a. Num a => a -> a -> a
- DTime
maxDT, a
a) forall a. a -> [a] -> [a]
: [(DTime, a)]
as)
| Bool
otherwise = (DTime
dt, a
a) forall a. a -> [a] -> [a]
: forall a.
DTime -> a -> FutureSampleStream a -> FutureSampleStream a
sRefineFutureStream DTime
maxDT a
a [(DTime, a)]
as
sRefineWith :: (a -> a -> a)
-> DTime
-> SignalSampleStream a
-> SignalSampleStream a
sRefineWith :: forall a.
(a -> a -> a)
-> DTime -> SignalSampleStream a -> SignalSampleStream a
sRefineWith a -> a -> a
interpolate DTime
maxDT (a
a, FutureSampleStream a
as) =
(a
a, forall a.
(a -> a -> a)
-> DTime -> a -> FutureSampleStream a -> FutureSampleStream a
refineFutureStreamWith a -> a -> a
interpolate DTime
maxDT a
a FutureSampleStream a
as)
where
refineFutureStreamWith :: (a -> a -> a)
-> DTime
-> a
-> FutureSampleStream a
-> FutureSampleStream a
refineFutureStreamWith :: forall a.
(a -> a -> a)
-> DTime -> a -> FutureSampleStream a -> FutureSampleStream a
refineFutureStreamWith a -> a -> a
interpolate DTime
maxDT a
_ [] = []
refineFutureStreamWith a -> a -> a
interpolate DTime
maxDT a
a0 ((DTime
dt, a
a) : [(DTime, a)]
as)
| DTime
dt forall a. Ord a => a -> a -> Bool
> DTime
maxDT
= (DTime
maxDT, a
a')
forall a. a -> [a] -> [a]
: forall a.
(a -> a -> a)
-> DTime -> a -> FutureSampleStream a -> FutureSampleStream a
refineFutureStreamWith a -> a -> a
interpolate DTime
maxDT a
a' ((DTime
dt forall a. Num a => a -> a -> a
- DTime
maxDT, a
a) forall a. a -> [a] -> [a]
: [(DTime, a)]
as)
| Bool
otherwise
= (DTime
dt, a
a) forall a. a -> [a] -> [a]
: forall a.
(a -> a -> a)
-> DTime -> a -> FutureSampleStream a -> FutureSampleStream a
refineFutureStreamWith a -> a -> a
interpolate DTime
maxDT a
a [(DTime, a)]
as
where
a' :: a
a' = a -> a -> a
interpolate a
a0 a
a
sClipAfterFrame :: Int -> SignalSampleStream a -> SignalSampleStream a
sClipAfterFrame :: forall a. Int -> SignalSampleStream a -> SignalSampleStream a
sClipAfterFrame Int
0 (a
x, FutureSampleStream a
_) = (a
x, [])
sClipAfterFrame Int
n (a
x, FutureSampleStream a
xs) = (a
x, FutureSampleStream a
xs')
where
xs' :: FutureSampleStream a
xs' = forall a. Int -> [a] -> [a]
take (Int
n forall a. Num a => a -> a -> a
- Int
1) FutureSampleStream a
xs
sClipAfterTime :: DTime -> SignalSampleStream a -> SignalSampleStream a
sClipAfterTime :: forall a. DTime -> SignalSampleStream a -> SignalSampleStream a
sClipAfterTime DTime
dt (a
x, FutureSampleStream a
xs) = (a
x, forall {t} {b}. (Ord t, Num t) => t -> [(t, b)] -> [(t, b)]
sClipAfterTime' DTime
dt FutureSampleStream a
xs)
where
sClipAfterTime' :: t -> [(t, b)] -> [(t, b)]
sClipAfterTime' t
dt [] = []
sClipAfterTime' t
dt ((t
dt', b
x) : [(t, b)]
xs)
| t
dt forall a. Ord a => a -> a -> Bool
< t
dt' = []
| Bool
otherwise = (t
dt', b
x) forall a. a -> [a] -> [a]
: t -> [(t, b)] -> [(t, b)]
sClipAfterTime' (t
dt forall a. Num a => a -> a -> a
- t
dt') [(t, b)]
xs
sClipBeforeFrame :: Int -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeFrame :: forall a. Int -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeFrame Int
0 (a
x, FutureSampleStream a
xs) = (a
x, FutureSampleStream a
xs)
sClipBeforeFrame Int
n (a
x, []) = (a
x, [])
sClipBeforeFrame Int
n (a
_, (DTime
dt, a
x) : FutureSampleStream a
xs) = forall a. Int -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeFrame (Int
n forall a. Num a => a -> a -> a
- Int
1) (a
x, FutureSampleStream a
xs)
sClipBeforeTime :: DTime -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeTime :: forall a. DTime -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeTime DTime
dt SignalSampleStream a
xs
| DTime
dt forall a. Ord a => a -> a -> Bool
<= DTime
0 = SignalSampleStream a
xs
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a b. (a, b) -> b
snd SignalSampleStream a
xs) = SignalSampleStream a
xs
| DTime
dt forall a. Ord a => a -> a -> Bool
< DTime
dt' = (a
x', [(DTime, a)]
xs')
| Bool
otherwise = forall a. DTime -> SignalSampleStream a -> SignalSampleStream a
sClipBeforeTime (DTime
dt forall a. Num a => a -> a -> a
- DTime
dt') (a
x', [(DTime, a)]
xs')
where
(a
_fstSample, ((DTime
dt', a
x') : [(DTime, a)]
xs')) = SignalSampleStream a
xs
evalSF :: SF a b
-> SignalSampleStream a
-> (SignalSampleStream b, FutureSF a b)
evalSF :: forall a b.
SF a b
-> SignalSampleStream a -> (SignalSampleStream b, FutureSF a b)
evalSF SF a b
sf (a
a, FutureSampleStream a
as) = ((b, FutureSampleStream b)
outputStrm, FutureSF a b
fsf')
where
(b
b, FutureSF a b
fsf) = forall a b. SF a b -> a -> (b, FutureSF a b)
evalAtZero SF a b
sf a
a
(FutureSampleStream b
bs, FutureSF a b
fsf') = forall a b.
FutureSF a b
-> FutureSampleStream a -> (FutureSampleStream b, FutureSF a b)
evalFutureSF FutureSF a b
fsf FutureSampleStream a
as
outputStrm :: (b, FutureSampleStream b)
outputStrm = (b
b, FutureSampleStream b
bs)
evalFutureSF :: FutureSF a b
-> FutureSampleStream a
-> (FutureSampleStream b, FutureSF a b)
evalFutureSF :: forall a b.
FutureSF a b
-> FutureSampleStream a -> (FutureSampleStream b, FutureSF a b)
evalFutureSF FutureSF a b
fsf [] = ([], FutureSF a b
fsf)
evalFutureSF FutureSF a b
fsf ((DTime
dt, a
a) : [(DTime, a)]
as) = ([(DTime, b)]
outputStrm, FutureSF a b
fsf'')
where
(b
b, FutureSF a b
fsf') = forall a b. FutureSF a b -> DTime -> a -> (b, FutureSF a b)
evalAt FutureSF a b
fsf DTime
dt a
a
([(DTime, b)]
bs, FutureSF a b
fsf'') = forall a b.
FutureSF a b
-> FutureSampleStream a -> (FutureSampleStream b, FutureSF a b)
evalFutureSF FutureSF a b
fsf' [(DTime, a)]
as
outputStrm :: [(DTime, b)]
outputStrm = (DTime
dt, b
b) forall a. a -> [a] -> [a]
: [(DTime, b)]
bs