module Synthesizer.Frame.Stereo (
   T, left, right, cons, map, swap,
   arrowFromMono, arrowFromMonoControlled, arrowFromChannels,
   Stereo.Channel(Left, Right), Stereo.select,
   Stereo.interleave,
   Stereo.sequence,
   Stereo.liftApplicative,
   ) where

import Sound.Frame.NumericPrelude.Stereo as Stereo
import Control.Arrow (Arrow, (^<<), (<<^), (&&&), )
import Data.Tuple.HT (mapSnd, )

import Prelude hiding (map, )


{- |
Run a causal process independently on each stereo channel.
-}
arrowFromMono ::
   (Arrow arrow) =>
   arrow a b -> arrow (Stereo.T a) (Stereo.T b)
arrowFromMono :: forall (arrow :: * -> * -> *) a b.
Arrow arrow =>
arrow a b -> arrow (T a) (T b)
arrowFromMono arrow a b
proc =
   (b -> b -> T b) -> (b, b) -> T b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry b -> b -> T b
forall a. a -> a -> T a
Stereo.cons ((b, b) -> T b) -> arrow (T a) (b, b) -> arrow (T a) (T b)
forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow a b
procarrow a b -> (T a -> a) -> arrow (T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^T a -> a
forall a. T a -> a
Stereo.left) arrow (T a) b -> arrow (T a) b -> arrow (T a) (b, b)
forall b c c'. arrow b c -> arrow b c' -> arrow b (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow a b
procarrow a b -> (T a -> a) -> arrow (T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^T a -> a
forall a. T a -> a
Stereo.right)

arrowFromMonoControlled ::
   (Arrow arrow) =>
   arrow (c,a) b -> arrow (c, Stereo.T a) (Stereo.T b)
arrowFromMonoControlled :: forall (arrow :: * -> * -> *) c a b.
Arrow arrow =>
arrow (c, a) b -> arrow (c, T a) (T b)
arrowFromMonoControlled arrow (c, a) b
proc =
   (b -> b -> T b) -> (b, b) -> T b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry b -> b -> T b
forall a. a -> a -> T a
Stereo.cons ((b, b) -> T b) -> arrow (c, T a) (b, b) -> arrow (c, T a) (T b)
forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow (c, a) b
proc arrow (c, a) b -> ((c, T a) -> (c, a)) -> arrow (c, T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^ (T a -> a) -> (c, T a) -> (c, a)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T a -> a
forall a. T a -> a
Stereo.left) arrow (c, T a) b -> arrow (c, T a) b -> arrow (c, T a) (b, b)
forall b c c'. arrow b c -> arrow b c' -> arrow b (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow (c, a) b
proc arrow (c, a) b -> ((c, T a) -> (c, a)) -> arrow (c, T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^ (T a -> a) -> (c, T a) -> (c, a)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T a -> a
forall a. T a -> a
Stereo.right)

arrowFromChannels ::
   (Arrow arrow) =>
   arrow a b -> arrow a b -> arrow (Stereo.T a) (Stereo.T b)
arrowFromChannels :: forall (arrow :: * -> * -> *) a b.
Arrow arrow =>
arrow a b -> arrow a b -> arrow (T a) (T b)
arrowFromChannels arrow a b
leftChan arrow a b
rightChan =
   (b -> b -> T b) -> (b, b) -> T b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry b -> b -> T b
forall a. a -> a -> T a
Stereo.cons ((b, b) -> T b) -> arrow (T a) (b, b) -> arrow (T a) (T b)
forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow a b
leftChanarrow a b -> (T a -> a) -> arrow (T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^T a -> a
forall a. T a -> a
Stereo.left) arrow (T a) b -> arrow (T a) b -> arrow (T a) (b, b)
forall b c c'. arrow b c -> arrow b c' -> arrow b (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow a b
rightChanarrow a b -> (T a -> a) -> arrow (T a) b
forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^T a -> a
forall a. T a -> a
Stereo.right)