{-# LANGUAGE BangPatterns #-}

module Zwirn.Core.Modulate where

{-
    Modulate.hs - functions modulating time
    Copyright (C) 2025, Martin Gius

    This library is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this library.  If not, see <http://www.gnu.org/licenses/>.
-}

import Control.Applicative
import Control.Monad (join)
import Control.Monad.Identity
import Data.Bifunctor
import Data.Fixed (mod')
import Data.Functor (void)
import Music.Theory.Bjorklund (bjorklund, iseq)
import Zwirn.Core.Core
import Zwirn.Core.Time
import Zwirn.Core.Tree
import Zwirn.Core.Types

modulateTime :: (a -> Time -> st -> Time) -> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime :: forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime a -> Time -> st -> Time
f a
x ZwirnT k st i b
b = (Time -> st -> k (Value i b, st)) -> ZwirnT k st i b
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn (\Time
t st
st -> ZwirnT k st i b -> Time -> st -> k (Value i b, st)
forall (k :: * -> *) st i a.
ZwirnT k st i a -> Time -> st -> k (Value i a, st)
unzwirn ZwirnT k st i b
b (a -> Time -> st -> Time
f a
x Time
t st
st) st
st)

rev :: ZwirnT k st i a -> ZwirnT k st i a
rev :: forall (k :: * -> *) st i a. ZwirnT k st i a -> ZwirnT k st i a
rev = (() -> Time -> st -> Time)
-> () -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (\()
_ Time
t st
_ -> -Time
t) ()

revBy :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
revBy :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
revBy ZwirnT k st i Time
tz ZwirnT k st i a
x = (Time -> Time -> st -> Time)
-> Time -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (\Time
x Time
t st
_ -> Integer -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Time -> Integer
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
x) Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
- Time -> Time
forall r. Real r => r -> r
frac Time
x) (Time -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Time
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i Time
tz ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => m (m a -> m b) -> m a -> m b
<$$> ZwirnT k st i a
x

sini :: ZwirnT k st i a -> ZwirnT k st i a
sini :: forall (k :: * -> *) st i a. ZwirnT k st i a -> ZwirnT k st i a
sini = (() -> Time -> st -> Time)
-> () -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (\()
_ Time
t st
_ -> Time -> Time
forall a. Floating a => a -> a
sin (Time
2 Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
forall a. Floating a => a
pi Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
t)) ()

fast :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
fast :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
fast ZwirnT k st i Time
tz ZwirnT k st i a
x = (Time -> Time -> st -> Time)
-> Time -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (\Time
x Time
t st
_ -> Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
x) (Time -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Time
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i Time
tz ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => m (m a -> m b) -> m a -> m b
<$$> ZwirnT k st i a
x

slow :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
slow :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
slow ZwirnT k st i Time
tz ZwirnT k st i a
x = (Time -> Time -> st -> Time)
-> Time -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime Time -> Time -> st -> Time
forall {a} {p}. (Eq a, Fractional a) => a -> a -> p -> a
timefunc (Time -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Time
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i Time
tz ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => m (m a -> m b) -> m a -> m b
<$$> ZwirnT k st i a
x
  where
    timefunc :: a -> a -> p -> a
timefunc a
x a
t p
_
      | a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = a
0
      | Bool
otherwise = a
t a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
x

shift :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
shift :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
shift ZwirnT k st i Time
tz ZwirnT k st i a
x = (Time -> Time -> st -> Time)
-> Time -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (\Time
x Time
t st
_ -> Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
- Time
x) (Time -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Time
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i Time
tz ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => m (m a -> m b) -> m a -> m b
<$$> ZwirnT k st i a
x

ply :: (MultiMonad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
ply :: forall (k :: * -> *) st i a.
MultiMonad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
ply ZwirnT k st i Time
tz = (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b.
MultiMonad m =>
(m a -> m b) -> m a -> m b
squeezeMap (ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
fast ZwirnT k st i Time
tz)

zoom :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
zoom :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time
-> ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
zoom ZwirnT k st i Time
t1 ZwirnT k st i Time
t2 ZwirnT k st i a
x = ((Time, Time) -> Time -> st -> Time)
-> (Time, Time) -> ZwirnT k st i a -> ZwirnT k st i a
forall a st (k :: * -> *) i b.
(a -> Time -> st -> Time)
-> a -> ZwirnT k st i b -> ZwirnT k st i b
modulateTime (Time, Time) -> Time -> st -> Time
forall {a} {p}. Real a => (a, a) -> a -> p -> a
timefunc ((Time, Time) -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i (Time, Time)
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i (Time, Time)
tup ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => m (m a -> m b) -> m a -> m b
<$$> ZwirnT k st i a
x
  where
    tup :: ZwirnT k st i (Time, Time)
tup = (Time -> Time -> (Time, Time))
-> ZwirnT k st i Time
-> ZwirnT k st i Time
-> ZwirnT k st i (Time, Time)
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) ZwirnT k st i Time
t1 ZwirnT k st i Time
t2
    timefunc :: (a, a) -> a -> p -> a
timefunc (a
st, a
en) a
t p
_
      | a
en a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
st = a -> a -> a
forall a. Real a => a -> a -> a
mod' a
t (a
en a -> a -> a
forall a. Num a => a -> a -> a
- a
st) a -> a -> a
forall a. Num a => a -> a -> a
+ a
st
      | a
en a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
st = a
0
      | a
en a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
st = a
st a -> a -> a
forall a. Num a => a -> a -> a
- a -> a -> a
forall a. Real a => a -> a -> a
mod' a
t (a
st a -> a -> a
forall a. Num a => a -> a -> a
- a
en)

timeloop :: (Monad k) => ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
timeloop :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
timeloop = ZwirnT k st i Time
-> ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time
-> ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
zoom (Time -> ZwirnT k st i Time
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
0)

loopfirst :: (Monad k) => ZwirnT k st i a -> ZwirnT k st i a
loopfirst :: forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i a -> ZwirnT k st i a
loopfirst = ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
timeloop (Time -> ZwirnT k st i Time
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
1)

fastcat :: (HasSilence k) => [ZwirnT k st i a] -> ZwirnT k st i a
fastcat :: forall (k :: * -> *) st i a.
HasSilence k =>
[ZwirnT k st i a] -> ZwirnT k st i a
fastcat [] = ZwirnT k st i a
forall st i a. ZwirnT k st i a
forall (k :: * -> *) st i a. HasSilence k => ZwirnT k st i a
silence
fastcat [ZwirnT k st i a]
obj = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn Time -> st -> k (Value i a, st)
q
  where
    q :: Time -> st -> k (Value i a, st)
q Time
t = ZwirnT k st i a -> Time -> st -> k (Value i a, st)
forall (k :: * -> *) st i a.
ZwirnT k st i a -> Time -> st -> k (Value i a, st)
unzwirn ZwirnT k st i a
item Time
phase
      where
        metre :: Time
metre = Int -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Time) -> Int -> Time
forall a b. (a -> b) -> a -> b
$ [ZwirnT k st i a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ZwirnT k st i a]
obj
        scaledPhase :: Time
scaledPhase = Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
metre
        item :: ZwirnT k st i a
item = Time -> [ZwirnT k st i a] -> ZwirnT k st i a
forall r a. RealFrac r => r -> [a] -> a
nth Time
scaledPhase [ZwirnT k st i a]
obj
        cyc :: Integer
cyc = Time -> Integer
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
t
        phase :: Time
phase = Time -> Time
forall r. Real r => r -> r
frac Time
scaledPhase Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Integer -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
cyc

slowcat :: (HasSilence k, Monad k) => [ZwirnT k st i a] -> ZwirnT k st i a
slowcat :: forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
[ZwirnT k st i a] -> ZwirnT k st i a
slowcat [ZwirnT k st i a]
zs = ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
slow (Time -> ZwirnT k st i Time
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Time -> ZwirnT k st i Time) -> Time -> ZwirnT k st i Time
forall a b. (a -> b) -> a -> b
$ Int -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Time) -> Int -> Time
forall a b. (a -> b) -> a -> b
$ [ZwirnT k st i a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ZwirnT k st i a]
zs) (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ [ZwirnT k st i a] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
HasSilence k =>
[ZwirnT k st i a] -> ZwirnT k st i a
fastcat [ZwirnT k st i a]
zs

-- | each (t,p) indicates the amount of time t for pattern p relative
-- | to the other lengths in the list, squeezed within one cycle
timecat :: (HasSilence k, Monad k) => [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
timecat :: forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
[(Time, ZwirnT k st i a)] -> ZwirnT k st i a
timecat [(Time, ZwirnT k st i a)]
tps = if Time
total Time -> Time -> Bool
forall a. Eq a => a -> a -> Bool
== Time
0 then ZwirnT k st i a
forall st i a. ZwirnT k st i a
forall (k :: * -> *) st i a. HasSilence k => ZwirnT k st i a
silence else [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
HasSilence k =>
[(Time, ZwirnT k st i a)] -> ZwirnT k st i a
cyclecat [(Time, ZwirnT k st i a)]
normalised
  where
    total :: Time
total = [Time] -> Time
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Time] -> Time) -> [Time] -> Time
forall a b. (a -> b) -> a -> b
$ ((Time, ZwirnT k st i a) -> Time)
-> [(Time, ZwirnT k st i a)] -> [Time]
forall a b. (a -> b) -> [a] -> [b]
map (Time, ZwirnT k st i a) -> Time
forall a b. (a, b) -> a
fst [(Time, ZwirnT k st i a)]
tps
    normalised :: [(Time, ZwirnT k st i a)]
normalised = ((Time, ZwirnT k st i a) -> (Time, ZwirnT k st i a))
-> [(Time, ZwirnT k st i a)] -> [(Time, ZwirnT k st i a)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Time
t, ZwirnT k st i a
p) -> (Time
t Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
total, ZwirnT k st i a
p)) [(Time, ZwirnT k st i a)]
tps

-- | each (t,p) indicates the amount of time t the pattern p is queried for
-- | the patterns in the list will be queried in order by their respective amounts
-- | Example: cyclecat [(1,pure 10), (2, slow 2 $ pure 20)] == < 10 20 ~ >
-- | Note: also works with rational numbers
cyclecat :: (HasSilence k) => [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
cyclecat :: forall (k :: * -> *) st i a.
HasSilence k =>
[(Time, ZwirnT k st i a)] -> ZwirnT k st i a
cyclecat [] = ZwirnT k st i a
forall st i a. ZwirnT k st i a
forall (k :: * -> *) st i a. HasSilence k => ZwirnT k st i a
silence
cyclecat [(Time, ZwirnT k st i a)]
xs = [(Time, ZwirnT k st i a)] -> Time -> ZwirnT k st i a
forall {k :: * -> *} {st} {i} {a}.
HasSilence k =>
[(Time, ZwirnT k st i a)] -> Time -> ZwirnT k st i a
cyclecatrec [(Time, ZwirnT k st i a)]
xs ([Time] -> Time
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Time] -> Time) -> [Time] -> Time
forall a b. (a -> b) -> a -> b
$ ((Time, ZwirnT k st i a) -> Time)
-> [(Time, ZwirnT k st i a)] -> [Time]
forall a b. (a -> b) -> [a] -> [b]
map (Time, ZwirnT k st i a) -> Time
forall a b. (a, b) -> a
fst [(Time, ZwirnT k st i a)]
xs)
  where
    -- len = sum $ map fst xs
    cyclecatrec :: [(Time, ZwirnT k st i a)] -> Time -> ZwirnT k st i a
cyclecatrec [(Time
_, ZwirnT k st i a
p)] Time
_ = ZwirnT k st i a
p
    cyclecatrec ((Time, ZwirnT k st i a)
x : [(Time, ZwirnT k st i a)]
xs) !Time
tot = (Time, ZwirnT k st i a)
-> (Time, ZwirnT k st i a) -> ZwirnT k st i a
forall (k :: * -> *) st i a.
HasSilence k =>
(Time, ZwirnT k st i a)
-> (Time, ZwirnT k st i a) -> ZwirnT k st i a
cat (Time, ZwirnT k st i a)
x (Time
tot Time -> Time -> Time
forall a. Num a => a -> a -> a
- (Time, ZwirnT k st i a) -> Time
forall a b. (a, b) -> a
fst (Time, ZwirnT k st i a)
x, [(Time, ZwirnT k st i a)] -> Time -> ZwirnT k st i a
cyclecatrec [(Time, ZwirnT k st i a)]
xs (Time
tot Time -> Time -> Time
forall a. Num a => a -> a -> a
- (Time, ZwirnT k st i a) -> Time
forall a b. (a, b) -> a
fst (Time, ZwirnT k st i a)
x))

cat :: (HasSilence k) => (Time, ZwirnT k st i a) -> (Time, ZwirnT k st i a) -> ZwirnT k st i a
cat :: forall (k :: * -> *) st i a.
HasSilence k =>
(Time, ZwirnT k st i a)
-> (Time, ZwirnT k st i a) -> ZwirnT k st i a
cat (Time Rational
0 Rational
_, ZwirnT k st i a
_) (Time Rational
0 Rational
_, ZwirnT k st i a
_) = ZwirnT k st i a
forall st i a. ZwirnT k st i a
forall (k :: * -> *) st i a. HasSilence k => ZwirnT k st i a
silence
cat (Time
t1, ZwirnT k st i a
p1) (Time
t2, ZwirnT k st i a
p2) = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn Time -> st -> k (Value i a, st)
q
  where
    q :: Time -> st -> k (Value i a, st)
q Time
t = ZwirnT k st i a -> Time -> st -> k (Value i a, st)
forall (k :: * -> *) st i a.
ZwirnT k st i a -> Time -> st -> k (Value i a, st)
unzwirn ZwirnT k st i a
item Time
phase
      where
        total :: Time
total = Time
t1 Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
t2
        cyc :: Time
cyc = Time
t Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
total
        first :: Bool
first = Time -> Time
forall r. Real r => r -> r
frac Time
cyc Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
< Time
t1 Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
total
        item :: ZwirnT k st i a
item = if Bool
first then ZwirnT k st i a
p1 else ZwirnT k st i a
p2
        phase :: Time
phase = if Bool
first then Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
- Integer -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Time -> Integer
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
cyc) Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
t2 else Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
- (Integer -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Time -> Integer
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
cyc) Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
1) Time -> Time -> Time
forall a. Num a => a -> a -> a
* Time
t1

fastcyclecat :: (HasSilence k, Monad k) => [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
fastcyclecat :: forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
[(Time, ZwirnT k st i a)] -> ZwirnT k st i a
fastcyclecat [(Time, ZwirnT k st i a)]
xs = [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
HasSilence k =>
[(Time, ZwirnT k st i a)] -> ZwirnT k st i a
cyclecat ([(Time, ZwirnT k st i a)] -> ZwirnT k st i a)
-> [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ ((Time, ZwirnT k st i a) -> (Time, ZwirnT k st i a))
-> [(Time, ZwirnT k st i a)] -> [(Time, ZwirnT k st i a)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Time
t, ZwirnT k st i a
x) -> (Time
t, ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
slow (Time -> ZwirnT k st i Time
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
t) ZwirnT k st i a
x)) [(Time, ZwirnT k st i a)]
xs