synthesizer-dimensional-0.4: src/Synthesizer/Dimensional/ChunkySize/Cut.hs
{-# LANGUAGE NoImplicitPrelude #-}
{- |
Copyright : (c) Henning Thielemann 2009
License : GPL
Maintainer : synthesizer@henning-thielemann.de
Stability : provisional
Portability : requires multi-parameter type classes
-}
module Synthesizer.Dimensional.ChunkySize.Cut (
splitAt, take, drop,
) 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.ChunkySize as ChunkySize
import qualified Synthesizer.ChunkySize.Cut as CutC
-- 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 NumericPrelude hiding (negate)
-- import PreludeBase as P
import Prelude hiding (splitAt, take, drop, length, )
type Signal s amp sig =
SigA.T (Rate.Phantom s) amp sig
type Size s =
SigA.T (Rate.Phantom s) Amp.Abstract ChunkySize.T
{- |
To avoid recomputation,
don't use this directly on State signals
but only after buffering.
-}
{-# INLINE splitAt #-}
splitAt :: (CutC.Transform sig) =>
Size s ->
Signal s amp sig ->
(Signal s amp sig, Signal s amp sig)
splitAt =
\t x ->
let (y,z) = CutC.splitAt (SigA.body t) $ SigA.body x
in (SigA.replaceBody y x,
SigA.replaceBody z x)
{-# INLINE take #-}
take :: (CutC.Transform sig) =>
Size s ->
Signal s amp sig ->
Signal s amp sig
take =
\t -> SigA.processBody (CutC.take (SigA.body t))
{-# INLINE drop #-}
drop :: (CutC.Transform sig) =>
Size s ->
Signal s amp sig ->
Signal s amp sig
drop =
\t -> SigA.processBody (CutC.drop (SigA.body t))