module Synthesizer.Causal.Arrow where

import qualified Synthesizer.Causal.Process as Causal
import qualified Synthesizer.Generic.Signal as SigG
import Control.Arrow (Arrow, )


class Arrow arrow => C arrow where
   apply ::
      (SigG.Transform sig a, SigG.Transform sig b) =>
      arrow a b -> sig a -> sig b

instance C Causal.T where
   apply :: forall (sig :: * -> *) a b.
(Transform sig a, Transform sig b) =>
T a b -> sig a -> sig b
apply = forall (sig :: * -> *) a b.
(Transform sig a, Transform sig b) =>
T a b -> sig a -> sig b
Causal.apply

instance C (->) where
   apply :: forall (sig :: * -> *) a b.
(Transform sig a, Transform sig b) =>
(a -> b) -> sig a -> sig b
apply = forall (sig :: * -> *) y0 y1.
(Transform0 sig, Storage (sig y0), Storage (sig y1)) =>
(y0 -> y1) -> sig y0 -> sig y1
SigG.map