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