packages feed

synthesizer-inference-0.2: src/Synthesizer/Inference/Monad/SignalSeq/Cut.hs

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

Maintainer  :  synthesizer@henning-thielemann.de
Stability   :  provisional
Portability :  requires multi-parameter type classes


Similar to "Synthesizer.Inference.Monad.Signal.Cut"
but the functions have monadic input and sequentialize it.
See "Synthesizer.Inference.Monad.SignalSeq".
-}
module Synthesizer.Inference.Monad.SignalSeq.Cut (
   {- * dissection -}
   splitAt,
   take,
   drop,
   takeUntilPause,
   unzip,
   unzip3,

   {- * glueing -}
   concat,
   append,
   zip,
   zip3) where

import qualified UniqueLogicNP.Explicit.Process    as Process
import qualified Synthesizer.Inference.Monad.Signal     as SigI
import qualified Synthesizer.Inference.Monad.Signal.Cut as CutI

import qualified Algebra.NormedSpace.Maximum as NormedMax
import qualified Algebra.OccasionallyScalar  as OccScalar
import qualified Algebra.Module              as Module
import qualified Algebra.RealField           as RealField
import qualified Algebra.Field               as Field
import qualified Algebra.Real                as Real
import qualified Algebra.Ring                as Ring

import UniqueLogicNP.Monad(liftP, liftP2, liftP3)
import PreludeBase (Ord, (.), sequence)
-- import NumericPrelude

{- * dissection -}

splitAt :: (RealField.C a, Field.C q, OccScalar.C a q) =>
   q -> SigI.Process a q v -> Process.T q (SigI.T a q v, SigI.T a q v)
splitAt t = liftP (CutI.splitAt t)

take :: (RealField.C a, Field.C q, OccScalar.C a q) =>
   q -> SigI.Process a q v -> SigI.Process a q v
take t = liftP (CutI.take t)

drop :: (RealField.C a, Field.C q, OccScalar.C a q) =>
   q -> SigI.Process a q v -> SigI.Process a q v
drop t = liftP (CutI.drop t)

takeUntilPause :: (RealField.C a, Field.C q,
                   NormedMax.C a v, OccScalar.C a q) =>
   q -> q -> SigI.Process a q v -> SigI.Process a q v
takeUntilPause y t = liftP (CutI.takeUntilPause y t)


unzip ::
   SigI.Process a q (v0, v1) -> Process.T q (SigI.T a q v0, SigI.T a q v1)
unzip = liftP CutI.unzip

unzip3 ::
      SigI.Process a q (v0, v1, v2)
   -> Process.T q (SigI.T a q v0, SigI.T a q v1, SigI.T a q v2)
unzip3 = liftP CutI.unzip3



{- * glueing -}

{- More efficient than 'foldr1 append'
   because it reduces the number of amplifications. -}
concat :: (RealField.C q, Ord q, Ring.C q, OccScalar.C a q,
           Module.C a v) =>
   [SigI.Process a q v] -> SigI.Process a q v
concat = liftP CutI.concat . sequence

append :: (Real.C q, Field.C q, Ord q, OccScalar.C a q,
         Module.C a v) =>
   SigI.Process a q v -> SigI.Process a q v -> SigI.Process a q v
append = liftP2 CutI.append


zip :: (Real.C q, Field.C q, Ord q, OccScalar.C a q,
        Module.C a v0, Module.C a v1)
   => SigI.Process a q v0
   -> SigI.Process a q v1
   -> SigI.Process a q (v0, v1)
zip = liftP2 CutI.zip

zip3 :: (Real.C q, Field.C q, Ord q, OccScalar.C a q,
         Module.C a v0, Module.C a v1, Module.C a v2)
   => SigI.Process a q v0
   -> SigI.Process a q v1
   -> SigI.Process a q v2
   -> SigI.Process a q (v0, v1, v2)
zip3 = liftP3 CutI.zip3