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 =
   forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. a -> a -> T a
Stereo.cons forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow a b
procforall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^forall a. T a -> a
Stereo.left) forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow a b
procforall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^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 =
   forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. a -> a -> T a
Stereo.cons forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow (c, a) b
proc forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^ forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd forall a. T a -> a
Stereo.left) forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow (c, a) b
proc forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^ forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd 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 =
   forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. a -> a -> T a
Stereo.cons forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
   (arrow a b
leftChanforall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^forall a. T a -> a
Stereo.left) forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (arrow a b
rightChanforall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^forall a. T a -> a
Stereo.right)