{-# LANGUAGE NoImplicitPrelude #-}
{- |
Copyright : (c) Henning Thielemann 2008-2009
License : GPL
Maintainer : synthesizer@henning-thielemann.de
Stability : provisional
Portability : requires multi-parameter type classes
-}
module Synthesizer.Dimensional.Rate.Cut (
splitAt, take, drop,
concat, append, ) where
import qualified Synthesizer.Dimensional.Process as Proc
import qualified Synthesizer.Dimensional.Rate as Rate
import qualified Synthesizer.Dimensional.Amplitude as Amp
import qualified Synthesizer.Dimensional.Signal.Private as SigA
import qualified Synthesizer.Generic.Cut as CutG
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
-- import qualified Number.NonNegative as NonNeg
import qualified Algebra.RealField as RealField
-- import qualified Algebra.Field as Field
import Data.Monoid (Monoid, mappend, mconcat, )
import NumericPrelude hiding (negate)
-- import PreludeBase as P
import Prelude hiding (splitAt, take, drop, concat, )
type Signal s amp sig =
SigA.T (Rate.Phantom s) amp sig
{- |
To avoid recomputation,
don't use this directly on State signals
but only after buffering.
-}
{-# INLINE splitAt #-}
splitAt :: (CutG.Transform sig, RealField.C t, Dim.C u) =>
DN.T u t ->
Proc.T s u t
(Signal s amp sig ->
(Signal s amp sig, Signal s amp sig))
splitAt t' =
flip fmap (Proc.toTimeScalar t') $
\t x ->
let (y,z) = CutG.splitAt (RealField.round t) $ SigA.body x
in (SigA.replaceBody y x,
SigA.replaceBody z x)
{-# INLINE take #-}
take :: (CutG.Transform sig, RealField.C t, Dim.C u) =>
DN.T u t ->
Proc.T s u t
(Signal s amp sig ->
Signal s amp sig)
take t' =
flip fmap (Proc.toTimeScalar t') $
\t -> SigA.processBody (CutG.take (RealField.round t))
{-# INLINE drop #-}
drop :: (CutG.Transform sig, RealField.C t, Dim.C u) =>
DN.T u t ->
Proc.T s u t
(Signal s amp sig ->
Signal s amp sig)
drop t' =
flip fmap (Proc.toTimeScalar t') $
\t -> SigA.processBody (CutG.drop (RealField.round t))
{-# INLINE concat #-}
concat ::
(Amp.Primitive amp, Monoid sig, Dim.C u) =>
Proc.T s u t (
[Signal s amp sig] ->
Signal s amp sig)
concat =
Proc.pure $
SigA.Cons Rate.Phantom Amp.primitive . mconcat . map SigA.body
{-# INLINE append #-}
append ::
(Amp.Primitive amp, Monoid sig, Dim.C u) =>
Proc.T s u t (
Signal s amp sig ->
Signal s amp sig ->
Signal s amp sig)
append =
Proc.pure $
\x -> SigA.processBody (mappend (SigA.body x))