{-# 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.RealRing      as RealRing
-- import qualified Algebra.Field          as Field


-- import NumericPrelude.Numeric hiding (negate)
-- import NumericPrelude.Base 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 :: forall sig s amp.
Transform sig =>
Size s -> Signal s amp sig -> (Signal s amp sig, Signal s amp sig)
splitAt =
   \Size s
t Signal s amp sig
x ->
      let (sig
y,sig
z) = forall sig. Transform sig => T -> sig -> (sig, sig)
CutC.splitAt (forall rate amplitude body. T rate amplitude body -> body
SigA.body Size s
t) forall a b. (a -> b) -> a -> b
$ forall rate amplitude body. T rate amplitude body -> body
SigA.body Signal s amp sig
x
      in  (forall sig1 rate amp sig0.
sig1 -> T rate amp sig0 -> T rate amp sig1
SigA.replaceBody sig
y Signal s amp sig
x,
           forall sig1 rate amp sig0.
sig1 -> T rate amp sig0 -> T rate amp sig1
SigA.replaceBody sig
z Signal s amp sig
x)

{-# INLINE take #-}
take :: (CutC.Transform sig) =>
   Size s ->
   Signal s amp sig ->
   Signal s amp sig
take :: forall sig s amp.
Transform sig =>
Size s -> Signal s amp sig -> Signal s amp sig
take =
   \Size s
t -> forall sig0 sig1 rate amp.
(sig0 -> sig1) -> T rate amp sig0 -> T rate amp sig1
SigA.processBody (forall sig. Transform sig => T -> sig -> sig
CutC.take (forall rate amplitude body. T rate amplitude body -> body
SigA.body Size s
t))

{-# INLINE drop #-}
drop :: (CutC.Transform sig) =>
   Size s ->
   Signal s amp sig ->
   Signal s amp sig
drop :: forall sig s amp.
Transform sig =>
Size s -> Signal s amp sig -> Signal s amp sig
drop =
   \Size s
t -> forall sig0 sig1 rate amp.
(sig0 -> sig1) -> T rate amp sig0 -> T rate amp sig1
SigA.processBody (forall sig. Transform sig => T -> sig -> sig
CutC.drop (forall rate amplitude body. T rate amplitude body -> body
SigA.body Size s
t))