{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Synthesizer.Plain.Control (
constant,
linear,
linearMultiscale,
linearMultiscaleNeutral,
linearStable,
linearMean,
line,
exponential, exponentialMultiscale, exponentialStable,
exponentialMultiscaleNeutral,
exponential2, exponential2Multiscale, exponential2Stable,
exponential2MultiscaleNeutral,
exponentialFromTo, exponentialFromToMultiscale,
vectorExponential,
vectorExponential2,
cosine, cosineMultiscale, cosineSubdiv, cosineStable,
cubicHermite,
cubicHermiteStable,
curveMultiscale,
curveMultiscaleNeutral,
cubicFunc,
cosineWithSlope,
) where
import qualified Synthesizer.Plain.Signal as Sig
import Data.List (zipWith4, tails, )
import Data.List.HT (iterateAssociative, )
import qualified Algebra.Module as Module
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Field as Field
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import Number.Complex (cis,real, )
import NumericPrelude.Numeric
import NumericPrelude.Base
constant :: y -> Sig.T y
constant :: forall y. y -> T y
constant = y -> [y]
forall y. y -> T y
repeat
linear :: Additive.C y =>
y
-> y
-> Sig.T y
linear :: forall y. C y => y -> y -> T y
linear y
d y
y0 = (y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y
dy -> y -> y
forall a. C a => a -> a -> a
+) y
y0
linearMultiscale :: Additive.C y =>
y
-> y
-> Sig.T y
linearMultiscale :: forall y. C y => y -> y -> T y
linearMultiscale = (y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale y -> y -> y
forall a. C a => a -> a -> a
(+)
linearMultiscaleNeutral :: Additive.C y =>
y
-> Sig.T y
linearMultiscaleNeutral :: forall y. C y => y -> T y
linearMultiscaleNeutral y
slope =
(y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscaleNeutral y -> y -> y
forall a. C a => a -> a -> a
(+) y
slope y
forall a. C a => a
zero
linearStable :: Ring.C y =>
y
-> y
-> Sig.T y
linearStable :: forall y. C y => y -> y -> T y
linearStable y
d y
y0 =
(y -> y) -> (y -> y -> y) -> y -> y -> T y
forall t y. C t => (t -> y) -> (y -> y -> y) -> t -> y -> T y
curveStable (y
dy -> y -> y
forall a. C a => a -> a -> a
*) y -> y -> y
forall a. C a => a -> a -> a
(+) y
1 y
y0
linearMean :: Field.C y =>
y
-> y
-> Sig.T y
linearMean :: forall y. C y => y -> y -> T y
linearMean y
d y
y0 = y
y0 y -> [y] -> [y]
forall a. a -> [a] -> [a]
:
(y -> [y] -> [y]) -> [y] -> [y] -> [y]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\y
pow [y]
xs -> y
y0y -> y -> y
forall a. C a => a -> a -> a
+y
pow y -> [y] -> [y]
forall a. a -> [a] -> [a]
: [y] -> [y]
forall y. C y => T y -> T y
linearSubdivision [y]
xs)
[y]
forall a. a
unreachable ((y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y
2y -> y -> y
forall a. C a => a -> a -> a
*) y
d)
linearSubdivision :: Field.C y =>
Sig.T y
-> Sig.T y
linearSubdivision :: forall y. C y => T y -> T y
linearSubdivision = (y -> y -> y) -> T y -> T y
forall y. (y -> y -> y) -> T y -> T y
subdivide (\y
x0 y
x1 -> (y
x0y -> y -> y
forall a. C a => a -> a -> a
+y
x1)y -> y -> y
forall a. C a => a -> a -> a
/y
2)
line :: Field.C y =>
Int
-> (y,y)
-> Sig.T y
line :: forall y. C y => Int -> (y, y) -> T y
line Int
n (y
y0,y
y1) =
Int -> [y] -> [y]
forall a. Int -> [a] -> [a]
take Int
n ([y] -> [y]) -> [y] -> [y]
forall a b. (a -> b) -> a -> b
$ y -> y -> [y]
forall y. C y => y -> y -> T y
linear ((y
y1y -> y -> y
forall a. C a => a -> a -> a
-y
y0) y -> y -> y
forall a. C a => a -> a -> a
/ Int -> y
forall a b. (C a, C b) => a -> b
fromIntegral Int
n) y
y0
exponential, exponentialMultiscale, exponentialStable :: Trans.C y =>
y
-> y
-> Sig.T y
exponential :: forall y. C y => y -> y -> T y
exponential y
time = (y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y -> y -> y
forall a. C a => a -> a -> a
* y -> y
forall a. C a => a -> a
exp (- y -> y
forall a. C a => a -> a
recip y
time))
exponentialMultiscale :: forall y. C y => y -> y -> T y
exponentialMultiscale y
time = (y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale y -> y -> y
forall a. C a => a -> a -> a
(*) (y -> y
forall a. C a => a -> a
exp (- y -> y
forall a. C a => a -> a
recip y
time))
exponentialStable :: forall y. C y => y -> y -> T y
exponentialStable y
time = (y -> y) -> y -> y -> T y
forall y t. (C y, C t) => (t -> y) -> t -> y -> T y
exponentialStableGen y -> y
forall a. C a => a -> a
exp (- y -> y
forall a. C a => a -> a
recip y
time)
exponentialMultiscaleNeutral :: Trans.C y =>
y
-> Sig.T y
exponentialMultiscaleNeutral :: forall y. C y => y -> T y
exponentialMultiscaleNeutral y
time =
(y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscaleNeutral y -> y -> y
forall a. C a => a -> a -> a
(*) (y -> y
forall a. C a => a -> a
exp (- y -> y
forall a. C a => a -> a
recip y
time)) y
forall a. C a => a
one
exponential2, exponential2Multiscale, exponential2Stable :: Trans.C y =>
y
-> y
-> Sig.T y
exponential2 :: forall y. C y => y -> y -> T y
exponential2 y
halfLife = (y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y -> y -> y
forall a. C a => a -> a -> a
* y
0.5 y -> y -> y
forall a. C a => a -> a -> a
** y -> y
forall a. C a => a -> a
recip y
halfLife)
exponential2Multiscale :: forall y. C y => y -> y -> T y
exponential2Multiscale y
halfLife = (y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale y -> y -> y
forall a. C a => a -> a -> a
(*) (y
0.5 y -> y -> y
forall a. C a => a -> a -> a
** y -> y
forall a. C a => a -> a
recip y
halfLife)
exponential2Stable :: forall y. C y => y -> y -> T y
exponential2Stable y
halfLife = (y -> y) -> y -> y -> T y
forall y t. (C y, C t) => (t -> y) -> t -> y -> T y
exponentialStableGen (y
0.5 y -> y -> y
forall a. C a => a -> a -> a
**) (y -> y
forall a. C a => a -> a
recip y
halfLife)
exponential2MultiscaleNeutral :: Trans.C y =>
y
-> Sig.T y
exponential2MultiscaleNeutral :: forall y. C y => y -> T y
exponential2MultiscaleNeutral y
halfLife =
(y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscaleNeutral y -> y -> y
forall a. C a => a -> a -> a
(*) (y
0.5 y -> y -> y
forall a. C a => a -> a -> a
** y -> y
forall a. C a => a -> a
recip y
halfLife) y
forall a. C a => a
one
exponentialFromTo, exponentialFromToMultiscale :: Trans.C y =>
y
-> y
-> y
-> Sig.T y
exponentialFromTo :: forall y. C y => y -> y -> y -> T y
exponentialFromTo y
time y
y0 y
y1 =
(y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y -> y -> y
forall a. C a => a -> a -> a
* (y
y1y -> y -> y
forall a. C a => a -> a -> a
/y
y0) y -> y -> y
forall a. C a => a -> a -> a
** y -> y
forall a. C a => a -> a
recip y
time) y
y0
exponentialFromToMultiscale :: forall y. C y => y -> y -> y -> T y
exponentialFromToMultiscale y
time y
y0 y
y1 =
(y -> y -> y) -> y -> y -> T y
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale y -> y -> y
forall a. C a => a -> a -> a
(*) ((y
y1y -> y -> y
forall a. C a => a -> a -> a
/y
y0) y -> y -> y
forall a. C a => a -> a -> a
** y -> y
forall a. C a => a -> a
recip y
time) y
y0
exponentialStableGen :: (Ring.C y, Ring.C t) =>
(t -> y)
-> t
-> y
-> Sig.T y
exponentialStableGen :: forall y t. (C y, C t) => (t -> y) -> t -> y -> T y
exponentialStableGen t -> y
expFunc = (t -> y) -> (y -> y -> y) -> t -> y -> T y
forall t y. C t => (t -> y) -> (y -> y -> y) -> t -> y -> T y
curveStable t -> y
expFunc y -> y -> y
forall a. C a => a -> a -> a
(*)
vectorExponential :: (Trans.C y, Module.C y v) =>
y
-> v
-> Sig.T v
vectorExponential :: forall y v. (C y, C y v) => y -> v -> T v
vectorExponential y
time v
y0 = (v -> v) -> v -> [v]
forall a. (a -> a) -> a -> [a]
iterate (y -> y
forall a. C a => a -> a
exp (-y
1y -> y -> y
forall a. C a => a -> a -> a
/y
time) y -> v -> v
forall a v. C a v => a -> v -> v
*>) v
y0
vectorExponential2 :: (Trans.C y, Module.C y v) =>
y
-> v
-> Sig.T v
vectorExponential2 :: forall y v. (C y, C y v) => y -> v -> T v
vectorExponential2 y
halfLife v
y0 = (v -> v) -> v -> [v]
forall a. (a -> a) -> a -> [a]
iterate (y
0.5y -> y -> y
forall a. C a => a -> a -> a
**(y
1y -> y -> y
forall a. C a => a -> a -> a
/y
halfLife) y -> v -> v
forall a v. C a v => a -> v -> v
*>) v
y0
cosine, cosineMultiscale, cosineSubdiv, cosineStable :: Trans.C y =>
y
-> y
-> Sig.T y
cosine :: forall y. C y => y -> y -> T y
cosine = (y -> y -> T y) -> y -> y -> T y
forall y signal. C y => (y -> y -> signal) -> y -> y -> signal
cosineWithSlope ((y -> y -> T y) -> y -> y -> T y)
-> (y -> y -> T y) -> y -> y -> T y
forall a b. (a -> b) -> a -> b
$
\y
d y
x -> (y -> y) -> T y -> T y
forall a b. (a -> b) -> [a] -> [b]
map y -> y
forall a. C a => a -> a
cos (y -> y -> T y
forall y. C y => y -> y -> T y
linear y
d y
x)
cosineMultiscale :: forall y. C y => y -> y -> T y
cosineMultiscale = (y -> y -> T y) -> y -> y -> T y
forall y signal. C y => (y -> y -> signal) -> y -> y -> signal
cosineWithSlope ((y -> y -> T y) -> y -> y -> T y)
-> (y -> y -> T y) -> y -> y -> T y
forall a b. (a -> b) -> a -> b
$
\y
d y
x -> (T y -> y) -> [T y] -> T y
forall a b. (a -> b) -> [a] -> [b]
map T y -> y
forall a. T a -> a
real ((T y -> T y -> T y) -> T y -> T y -> [T y]
forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale T y -> T y -> T y
forall a. C a => a -> a -> a
(*) (y -> T y
forall a. C a => a -> T a
cis y
d) (y -> T y
forall a. C a => a -> T a
cis y
x))
cosineSubdiv :: forall y. C y => y -> y -> T y
cosineSubdiv =
let aux :: a -> a -> [a]
aux a
d a
y0 =
a -> a
forall a. C a => a -> a
cos a
y0 a -> [a] -> [a]
forall a. a -> [a] -> [a]
:
(a -> [a] -> [a]) -> [a] -> [a] -> [a]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\a
pow [a]
xs -> a -> a
forall a. C a => a -> a
cos(a
y0a -> a -> a
forall a. C a => a -> a -> a
+a
pow) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
forall y. C y => y -> T y -> T y
cosineSubdivision a
pow [a]
xs)
[a]
forall a. a
unreachable ((a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate (a
2a -> a -> a
forall a. C a => a -> a -> a
*) a
d)
in (y -> y -> T y) -> y -> y -> T y
forall y signal. C y => (y -> y -> signal) -> y -> y -> signal
cosineWithSlope y -> y -> T y
forall y. C y => y -> y -> T y
aux
cosineSubdivision :: Trans.C y =>
y
-> Sig.T y
-> Sig.T y
cosineSubdivision :: forall y. C y => y -> T y -> T y
cosineSubdivision y
angle =
let k :: y
k = y -> y
forall a. C a => a -> a
recip (y
2 y -> y -> y
forall a. C a => a -> a -> a
* y -> y
forall a. C a => a -> a
cos y
angle)
in (y -> y -> y) -> T y -> T y
forall y. (y -> y -> y) -> T y -> T y
subdivide (\y
x0 y
x1 -> (y
x0y -> y -> y
forall a. C a => a -> a -> a
+y
x1)y -> y -> y
forall a. C a => a -> a -> a
*y
k)
cosineStable :: forall y. C y => y -> y -> T y
cosineStable = (y -> y -> T y) -> y -> y -> T y
forall y signal. C y => (y -> y -> signal) -> y -> y -> signal
cosineWithSlope ((y -> y -> T y) -> y -> y -> T y)
-> (y -> y -> T y) -> y -> y -> T y
forall a b. (a -> b) -> a -> b
$
\y
d y
x -> (T y -> y) -> [T y] -> T y
forall a b. (a -> b) -> [a] -> [b]
map T y -> y
forall a. T a -> a
real ((y -> T y) -> y -> T y -> [T y]
forall y t. (C y, C t) => (t -> y) -> t -> y -> T y
exponentialStableGen y -> T y
forall a. C a => a -> T a
cis y
d (y -> T y
forall a. C a => a -> T a
cis y
x))
cosineWithSlope :: Trans.C y =>
(y -> y -> signal)
-> y
-> y
-> signal
cosineWithSlope :: forall y signal. C y => (y -> y -> signal) -> y -> y -> signal
cosineWithSlope y -> y -> signal
c y
t0 y
t1 =
let inc :: y
inc = y
forall a. C a => a
piy -> y -> y
forall a. C a => a -> a -> a
/(y
t1y -> y -> y
forall a. C a => a -> a -> a
-y
t0)
in y -> y -> signal
c y
inc (-y
t0y -> y -> y
forall a. C a => a -> a -> a
*y
inc)
cubicHermite :: Field.C y => (y, (y,y)) -> (y, (y,y)) -> Sig.T y
cubicHermite :: forall y. C y => (y, (y, y)) -> (y, (y, y)) -> T y
cubicHermite (y, (y, y))
node0 (y, (y, y))
node1 =
(y -> y) -> [y] -> [y]
forall a b. (a -> b) -> [a] -> [b]
map ((y, (y, y)) -> (y, (y, y)) -> y -> y
forall y. C y => (y, (y, y)) -> (y, (y, y)) -> y -> y
cubicFunc (y, (y, y))
node0 (y, (y, y))
node1) (y -> y -> [y]
forall y. C y => y -> y -> T y
linear y
1 y
0)
cubicFunc :: Field.C y => (y, (y,y)) -> (y, (y,y)) -> y -> y
cubicFunc :: forall y. C y => (y, (y, y)) -> (y, (y, y)) -> y -> y
cubicFunc (y
t0, (y
y0,y
dy0)) (y
t1, (y
y1,y
dy1)) y
t =
let dt :: y
dt = y
t0y -> y -> y
forall a. C a => a -> a -> a
-y
t1
dt0 :: y
dt0 = y
ty -> y -> y
forall a. C a => a -> a -> a
-y
t0
dt1 :: y
dt1 = y
ty -> y -> y
forall a. C a => a -> a -> a
-y
t1
x0 :: y
x0 = y
dt1y -> Integer -> y
forall a. C a => a -> Integer -> a
^Integer
2
x1 :: y
x1 = y
dt0y -> Integer -> y
forall a. C a => a -> Integer -> a
^Integer
2
in ((y
dy0y -> y -> y
forall a. C a => a -> a -> a
*y
dt0 y -> y -> y
forall a. C a => a -> a -> a
+ y
y0 y -> y -> y
forall a. C a => a -> a -> a
* (y
1y -> y -> y
forall a. C a => a -> a -> a
-y
2y -> y -> y
forall a. C a => a -> a -> a
/y
dty -> y -> y
forall a. C a => a -> a -> a
*y
dt0)) y -> y -> y
forall a. C a => a -> a -> a
* y
x0 y -> y -> y
forall a. C a => a -> a -> a
+
(y
dy1y -> y -> y
forall a. C a => a -> a -> a
*y
dt1 y -> y -> y
forall a. C a => a -> a -> a
+ y
y1 y -> y -> y
forall a. C a => a -> a -> a
* (y
1y -> y -> y
forall a. C a => a -> a -> a
+y
2y -> y -> y
forall a. C a => a -> a -> a
/y
dty -> y -> y
forall a. C a => a -> a -> a
*y
dt1)) y -> y -> y
forall a. C a => a -> a -> a
* y
x1) y -> y -> y
forall a. C a => a -> a -> a
/ y
dty -> Integer -> y
forall a. C a => a -> Integer -> a
^Integer
2
cubicHermiteStable :: Field.C y => (y, (y,y)) -> (y, (y,y)) -> Sig.T y
cubicHermiteStable :: forall y. C y => (y, (y, y)) -> (y, (y, y)) -> T y
cubicHermiteStable (y, (y, y))
node0 (y, (y, y))
node1 =
(y, (y, y)) -> (y, (y, y)) -> y -> y
forall y. C y => (y, (y, y)) -> (y, (y, y)) -> y -> y
cubicFunc (y, (y, y))
node0 (y, (y, y))
node1 y
0 y -> [y] -> [y]
forall a. a -> [a] -> [a]
:
(y -> [y] -> [y]) -> [y] -> [y] -> [y]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\y
pow [y]
xs ->
(y, (y, y)) -> (y, (y, y)) -> y -> y
forall y. C y => (y, (y, y)) -> (y, (y, y)) -> y -> y
cubicFunc (y, (y, y))
node0 (y, (y, y))
node1 y
pow y -> [y] -> [y]
forall a. a -> [a] -> [a]
: [y] -> y
forall a. HasCallStack => [a] -> a
head [y]
xs y -> [y] -> [y]
forall a. a -> [a] -> [a]
:
(y, (y, y)) -> (y, (y, y)) -> y -> y
forall y. C y => (y, (y, y)) -> (y, (y, y)) -> y -> y
cubicFunc (y, (y, y))
node0 (y, (y, y))
node1 (y
3y -> y -> y
forall a. C a => a -> a -> a
*y
pow) y -> [y] -> [y]
forall a. a -> [a] -> [a]
: [y] -> [y]
forall y. C y => T y -> T y
cubicSubdivision [y]
xs)
[y]
forall a. a
unreachable ((y -> y) -> y -> [y]
forall a. (a -> a) -> a -> [a]
iterate (y
2y -> y -> y
forall a. C a => a -> a -> a
*) y
1)
cubicSubdivision :: Field.C y => Sig.T y -> Sig.T y
cubicSubdivision :: forall y. C y => T y -> T y
cubicSubdivision T y
xs =
let T y
xs0:T y
xs1:T y
xs2:T y
xs3:[T y]
_ = T y -> [T y]
forall a. [a] -> [[a]]
tails T y
xs
inter :: T y
inter = (y -> y -> y -> y -> y) -> T y -> T y -> T y -> T y -> T y
forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
zipWith4 (\y
x0 y
x1 y
x2 y
x3 -> (y
9y -> y -> y
forall a. C a => a -> a -> a
*(y
x1y -> y -> y
forall a. C a => a -> a -> a
+y
x2) y -> y -> y
forall a. C a => a -> a -> a
- (y
x0y -> y -> y
forall a. C a => a -> a -> a
+y
x3))y -> y -> y
forall a. C a => a -> a -> a
/y
16)
T y
xs0 T y
xs1 T y
xs2 T y
xs3
in T y -> y
forall a. HasCallStack => [a] -> a
head T y
xs1 y -> T y -> T y
forall a. a -> [a] -> [a]
: T (y, y) -> T y
forall a. T (a, a) -> T a
flattenPairs (T y -> T y -> T (y, y)
forall a b. [a] -> [b] -> [(a, b)]
zip T y
inter T y
xs2)
curveStable :: (Additive.C t) =>
(t -> y)
-> (y -> y -> y)
-> t
-> y
-> Sig.T y
curveStable :: forall t y. C t => (t -> y) -> (y -> y -> y) -> t -> y -> T y
curveStable t -> y
expFunc y -> y -> y
op t
time y
y0 =
y
y0 y -> [y] -> [y]
forall a. a -> [a] -> [a]
: (y -> y) -> [y] -> [y]
forall a b. (a -> b) -> [a] -> [b]
map (y -> y -> y
op y
y0)
((t -> [y] -> [y]) -> [y] -> [t] -> [y]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
(\t
e [y]
xs ->
let k :: y
k = t -> y
expFunc t
e
in y
k y -> [y] -> [y]
forall a. a -> [a] -> [a]
: (y -> (y, y)) -> [y] -> [y]
forall a b. (a -> (b, b)) -> T a -> T b
concatMapPair (\y
x -> (y
x, y -> y -> y
op y
x y
k)) [y]
xs)
[y]
forall a. a
unreachable ((t -> t) -> t -> [t]
forall a. (a -> a) -> a -> [a]
iterate t -> t
forall t. C t => t -> t
double t
time))
unreachable :: a
unreachable :: forall a. a
unreachable = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"only reachable in infinity"
double :: Additive.C t => t -> t
double :: forall t. C t => t -> t
double t
t = t
tt -> t -> t
forall a. C a => a -> a -> a
+t
t
concatMapPair :: (a -> (b,b)) -> Sig.T a -> Sig.T b
concatMapPair :: forall a b. (a -> (b, b)) -> T a -> T b
concatMapPair a -> (b, b)
f = T (b, b) -> T b
forall a. T (a, a) -> T a
flattenPairs (T (b, b) -> T b) -> (T a -> T (b, b)) -> T a -> T b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> (b, b)) -> T a -> T (b, b)
forall a b. (a -> b) -> [a] -> [b]
map a -> (b, b)
f
flattenPairs :: Sig.T (a,a) -> Sig.T a
flattenPairs :: forall a. T (a, a) -> T a
flattenPairs = ((a, a) -> T a -> T a) -> T a -> [(a, a)] -> T a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(a
a,a
b) T a
xs -> a
aa -> T a -> T a
forall a. a -> [a] -> [a]
:a
ba -> T a -> T a
forall a. a -> [a] -> [a]
:T a
xs) []
subdivide :: (y -> y -> y) -> Sig.T y -> Sig.T y
subdivide :: forall y. (y -> y -> y) -> T y -> T y
subdivide y -> y -> y
f xs0 :: T y
xs0@(y
x:T y
xs1) =
y
x y -> T y -> T y
forall a. a -> [a] -> [a]
: T (y, y) -> T y
forall a. T (a, a) -> T a
flattenPairs ((y -> y -> (y, y)) -> T y -> T y -> T (y, y)
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\y
x0 y
x1 -> (y -> y -> y
f y
x0 y
x1, y
x1)) T y
xs0 T y
xs1)
subdivide y -> y -> y
_ [] = []
_concatMapPair :: (a -> (b,b)) -> Sig.T a -> Sig.T b
_concatMapPair :: forall a b. (a -> (b, b)) -> T a -> T b
_concatMapPair a -> (b, b)
f = (a -> [b]) -> [a] -> [b]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((\(b
x,b
y) -> [b
x,b
y]) ((b, b) -> [b]) -> (a -> (b, b)) -> a -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, b)
f)
curveMultiscale :: (y -> y -> y) -> y -> y -> Sig.T y
curveMultiscale :: forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscale y -> y -> y
op y
d y
y0 =
y
y0 y -> [y] -> [y]
forall a. a -> [a] -> [a]
: (y -> y) -> [y] -> [y]
forall a b. (a -> b) -> [a] -> [b]
map (y -> y -> y
op y
y0) ((y -> y -> y) -> y -> [y]
forall a. (a -> a -> a) -> a -> [a]
iterateAssociative y -> y -> y
op y
d)
curveMultiscaleNeutral :: (y -> y -> y) -> y -> y -> Sig.T y
curveMultiscaleNeutral :: forall y. (y -> y -> y) -> y -> y -> T y
curveMultiscaleNeutral y -> y -> y
op y
d y
neutral =
y
neutral y -> [y] -> [y]
forall a. a -> [a] -> [a]
: (y -> y -> y) -> y -> [y]
forall a. (a -> a -> a) -> a -> [a]
iterateAssociative y -> y -> y
op y
d