module Zwirn.Core.Structure where
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.Modulate
import Zwirn.Core.Time
import Zwirn.Core.Tree
import Zwirn.Core.Types
import Prelude hiding (enumFromTo)
runFromTo :: (Ord a, Num a, Monad k, HasSilence k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
runFromTo :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
runFromTo ZwirnT k st i a
xz ZwirnT k st i a
yz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(HasSilence k, Applicative k, Ord a, Num a) =>
a -> a -> ZwirnT k st i a
en (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> 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 a
xz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz
where
en :: a -> a -> ZwirnT k st i a
en a
x a
y = [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] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> [a]
enumerateFromTo a
x a
y
runFromThenTo :: (Ord a, Num a, Monad k, HasSilence k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
runFromThenTo :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a
-> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
runFromThenTo ZwirnT k st i a
xz ZwirnT k st i a
yz ZwirnT k st i a
zz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(HasSilence k, Applicative k, Ord a, Num a) =>
a -> a -> a -> ZwirnT k st i a
en (a -> a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i a
xz ZwirnT k st i (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
zz
where
en :: a -> a -> a -> ZwirnT k st i a
en a
x a
y a
z = [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] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> a -> [a]
enumerateFromThenTo a
x a
y a
z
slowrunFromTo :: (Ord a, Num a, Monad k, HasSilence k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
slowrunFromTo :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
slowrunFromTo ZwirnT k st i a
xz ZwirnT k st i a
yz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(HasSilence k, Monad k, Ord a, Num a) =>
a -> a -> ZwirnT k st i a
en (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> 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 a
xz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz
where
en :: a -> a -> ZwirnT k st i a
en a
x a
y = [ZwirnT k st i a] -> ZwirnT k st i a
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] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> [a]
enumerateFromTo a
x a
y
slowrunFromThenTo :: (Ord a, Num a, Monad k, HasSilence k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
slowrunFromThenTo :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a
-> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
slowrunFromThenTo ZwirnT k st i a
xz ZwirnT k st i a
yz ZwirnT k st i a
zz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(HasSilence k, Monad k, Ord a, Num a) =>
a -> a -> a -> ZwirnT k st i a
en (a -> a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i a
xz ZwirnT k st i (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
zz
where
en :: a -> a -> a -> ZwirnT k st i a
en a
x a
y a
z = [ZwirnT k st i a] -> ZwirnT k st i a
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] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> a -> [a]
enumerateFromThenTo a
x a
y a
z
run :: (Monad k, HasSilence k) => ZwirnT k st i Int -> ZwirnT k st i Int
run :: forall (k :: * -> *) st i.
(Monad k, HasSilence k) =>
ZwirnT k st i Int -> ZwirnT k st i Int
run ZwirnT k st i Int
n = ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
runFromTo (Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0) ((Int -> Int) -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a b. (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ZwirnT k st i Int
n)
slowrun :: (Monad k, HasSilence k) => ZwirnT k st i Int -> ZwirnT k st i Int
slowrun :: forall (k :: * -> *) st i.
(Monad k, HasSilence k) =>
ZwirnT k st i Int -> ZwirnT k st i Int
slowrun ZwirnT k st i Int
n = ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k, HasSilence k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
slowrunFromTo (Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0) ((Int -> Int) -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a b. (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ZwirnT k st i Int
n)
struct :: (MultiMonad k) => ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
struct :: forall (k :: * -> *) st i a b.
MultiMonad k =>
ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
struct = (k (Value i a, st) -> k (Value i b, st) -> k (Value i b, st))
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
forall (k :: * -> *) i a st b c.
(k (Value i a, st) -> k (Value i b, st) -> k (Value i c, st))
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
withInner2 (((Value i a, st) -> (Value i b, st) -> (Value i b, st))
-> k (Value i a, st) -> k (Value i b, st) -> k (Value i b, st)
forall a b c. (a -> b -> c) -> k a -> k b -> k c
forall (f :: * -> *) a b c.
MultiApplicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2Left (Value i a, st) -> (Value i b, st) -> (Value i b, st)
forall {i} {a} {b} {i} {a} {b}.
(Value i a, b) -> (Value i a, b) -> (Value i a, b)
f)
where
f :: (Value i a, b) -> (Value i a, b) -> (Value i a, b)
f (Value i a
v1, b
st) (Value i a
v2, b
_) = (a -> Time -> [i] -> Value i a
forall i a. a -> Time -> [i] -> Value i a
Value (Value i a -> a
forall i a. Value i a -> a
value Value i a
v2) (Value i a -> Time
forall i a. Value i a -> Time
time Value i a
v1) (Value i a -> [i]
forall i a. Value i a -> [i]
info Value i a
v1), b
st)
segment :: (MultiMonad k, HasSilence k) => ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
segment :: forall (k :: * -> *) st i a.
(MultiMonad k, HasSilence k) =>
ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
segment = ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
forall (k :: * -> *) st i a b.
MultiMonad k =>
ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
struct (ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a)
-> (ZwirnT k st i Int -> ZwirnT k st i Int)
-> ZwirnT k st i Int
-> ZwirnT k st i a
-> ZwirnT k st i a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ZwirnT k st i Int -> ZwirnT k st i Int
forall (k :: * -> *) st i.
(Monad k, HasSilence k) =>
ZwirnT k st i Int -> ZwirnT k st i Int
run
euclidOff :: (HasSilence k, Monad k) => ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
euclidOff :: forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i a
-> ZwirnT k st i a
euclidOff ZwirnT k st i Int
i1 ZwirnT k st i Int
i2 ZwirnT k st i Int
i3 ZwirnT k st i a
x = Int -> Int -> Int -> ZwirnT k st i a -> ZwirnT k st i a
forall {k :: * -> *} {st} {i} {a}.
(HasSilence k, Monad k) =>
Int -> Int -> Int -> ZwirnT k st i a -> ZwirnT k st i a
euclidOff' (Int -> Int -> Int -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Int
-> ZwirnT k st i (Int -> Int -> 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 Int
i1 ZwirnT k st i (Int -> Int -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Int
-> ZwirnT k st i (Int -> ZwirnT k st i a -> ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i Int
i2 ZwirnT k st i (Int -> ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i Int
-> ZwirnT k st i (ZwirnT k st i a -> ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i Int
i3 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
euclidOff' :: Int -> Int -> Int -> ZwirnT k st i a -> ZwirnT k st i a
euclidOff' Int
a Int
b Int
off ZwirnT k st i a
x = [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
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)] -> ZwirnT k st i a)
-> [(Time, ZwirnT k st i a)] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (Int -> (Time, ZwirnT k st i a))
-> [Int] -> [(Time, ZwirnT k st i a)]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> (Int -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i :: Time, ZwirnT k st i a
x)) [Int]
ts
where
ts :: [Int]
ts = Int -> [Int] -> [Int]
forall {a}. Int -> [a] -> [a]
rotate Int
off ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ [Bool] -> [Int]
iseq ([Bool] -> [Int]) -> [Bool] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Bool]
bjorklund (Int
a, Int
b)
rotate :: Int -> [a] -> [a]
rotate Int
n [a]
xs = Int -> [a] -> [a]
forall {a}. Int -> [a] -> [a]
take Int
lxs ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [a] -> [a]
forall {a}. Int -> [a] -> [a]
drop ((-Int
n) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
lxs) ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [a]
xs where lxs :: Int
lxs = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
euclid :: (HasSilence k, Monad k) => ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
euclid :: forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
ZwirnT k st i Int
-> ZwirnT k st i Int -> ZwirnT k st i a -> ZwirnT k st i a
euclid ZwirnT k st i Int
x ZwirnT k st i Int
y = ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i a
-> ZwirnT k st i a
forall (k :: * -> *) st i a.
(HasSilence k, Monad k) =>
ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i Int
-> ZwirnT k st i a
-> ZwirnT k st i a
euclidOff ZwirnT k st i Int
x ZwirnT k st i Int
y (Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0)
left :: (MultiMonad k) => (ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c) -> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
left :: forall (k :: * -> *) st i a b c.
MultiMonad k =>
(ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
left ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
f ZwirnT k st i a
x ZwirnT k st i b
y = ZwirnT k st i a -> ZwirnT k st i c -> ZwirnT k st i c
forall (k :: * -> *) st i a b.
MultiMonad k =>
ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
struct ZwirnT k st i a
x (ZwirnT k st i c -> ZwirnT k st i c)
-> ZwirnT k st i c -> ZwirnT k st i c
forall a b. (a -> b) -> a -> b
$ ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
f ZwirnT k st i a
x ZwirnT k st i b
y
right :: (MultiMonad k) => (ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c) -> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
right :: forall (k :: * -> *) st i a b c.
MultiMonad k =>
(ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
right ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
f ZwirnT k st i a
x ZwirnT k st i b
y = ZwirnT k st i b -> ZwirnT k st i c -> ZwirnT k st i c
forall (k :: * -> *) st i a b.
MultiMonad k =>
ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i b
struct ZwirnT k st i b
y (ZwirnT k st i c -> ZwirnT k st i c)
-> ZwirnT k st i c -> ZwirnT k st i c
forall a b. (a -> b) -> a -> b
$ ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
f ZwirnT k st i a
x ZwirnT k st i b
y