{-# LANGUAGE NoImplicitPrelude #-}
{- |
Copyright   :  (c) Henning Thielemann 2008
License     :  GPL

Maintainer  :  synthesizer@henning-thielemann.de
Stability   :  provisional
Portability :  requires multi-parameter type classes
-}
module Synthesizer.Dimensional.Rate.Cut (
     take, drop,
   ) where

import qualified Synthesizer.Dimensional.Abstraction.Homogeneous as Hom

import qualified Synthesizer.Dimensional.RatePhantom as RP

import qualified Synthesizer.Dimensional.Process as Proc
-- import qualified Synthesizer.Dimensional.Rate as Rate

-- import Synthesizer.Dimensional.Process ((.:), (.^), )

import qualified Synthesizer.Dimensional.RateAmplitude.Signal as SigA
import qualified Synthesizer.State.Signal as Sig

import Synthesizer.Dimensional.RateAmplitude.Signal
   (toTimeScalar, )

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 (take, drop, )


{-# INLINE take #-}
take :: (Hom.C sig, RealField.C t, Dim.C u) =>
   DN.T u t -> Proc.T s u t (RP.T s sig y -> RP.T s sig y)
take t' =
   do t <- toTimeScalar t'
      return $ Hom.processSamples (Sig.take (RealField.round t))

{-# INLINE drop #-}
drop :: (Hom.C sig, RealField.C t, Dim.C u) =>
   DN.T u t -> Proc.T s u t (RP.T s sig y -> RP.T s sig y)
drop t' =
   do t <- toTimeScalar t'
      return $ Hom.processSamples (Sig.drop (RealField.round t))