module Synthesizer.PiecewiseConstant.Generic (
   toSignal,
   toSignalInit,
   toSignalInitWith,
   ) where

import qualified Synthesizer.PiecewiseConstant.Private as PC
import Synthesizer.PiecewiseConstant.Private (StrictTime)

import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.Generic.Cut    as CutG

import qualified Data.EventList.Relative.BodyTime as EventListBT
import qualified Data.EventList.Relative.TimeBody as EventList

import qualified Numeric.NonNegative.Wrapper as NonNegW



replicateLong ::
   (SigG.Write sig y) =>
   StrictTime -> y -> sig y
replicateLong :: forall (sig :: * -> *) y. Write sig y => StrictTime -> y -> sig y
replicateLong StrictTime
tl y
y =
   [sig y] -> sig y
forall sig. Monoid sig => [sig] -> sig
CutG.concat ([sig y] -> sig y) -> [sig y] -> sig y
forall a b. (a -> b) -> a -> b
$
   (ShortStrictTime -> sig y) -> [ShortStrictTime] -> [sig y]
forall a b. (a -> b) -> [a] -> [b]
map (\ShortStrictTime
t ->
      LazySize -> Int -> y -> sig y
forall y. Storage (sig y) => LazySize -> Int -> y -> sig y
forall (sig :: * -> *) y.
(Write0 sig, Storage (sig y)) =>
LazySize -> Int -> y -> sig y
SigG.replicate
--         (SigG.LazySize $ fromIntegral $ maxBound::Int)
         LazySize
SigG.defaultLazySize
         (ShortStrictTime -> Int
forall a. T a -> a
NonNegW.toNumber ShortStrictTime
t) y
y) ([ShortStrictTime] -> [sig y]) -> [ShortStrictTime] -> [sig y]
forall a b. (a -> b) -> a -> b
$
   StrictTime -> [ShortStrictTime]
PC.chopLongTime StrictTime
tl

{-# INLINE toSignal #-}
toSignal :: (SigG.Write sig y) => EventListBT.T StrictTime y -> sig y
toSignal :: forall (sig :: * -> *) y. Write sig y => T StrictTime y -> sig y
toSignal = (StrictTime -> y -> sig y) -> T StrictTime y -> sig y
forall (sig :: * -> *) y.
Transform sig y =>
(StrictTime -> y -> sig y) -> T StrictTime y -> sig y
PC.toSignal StrictTime -> y -> sig y
forall (sig :: * -> *) y. Write sig y => StrictTime -> y -> sig y
replicateLong

{-# INLINE toSignalInit #-}
toSignalInit :: (SigG.Write sig y) => y -> EventList.T StrictTime y -> sig y
toSignalInit :: forall (sig :: * -> *) y.
Write sig y =>
y -> T StrictTime y -> sig y
toSignalInit = (StrictTime -> y -> sig y) -> y -> T StrictTime y -> sig y
forall (sig :: * -> *) y.
Transform sig y =>
(StrictTime -> y -> sig y) -> y -> T StrictTime y -> sig y
PC.toSignalInit StrictTime -> y -> sig y
forall (sig :: * -> *) y. Write sig y => StrictTime -> y -> sig y
replicateLong

{-# INLINE toSignalInitWith #-}
toSignalInitWith ::
   (SigG.Write sig c) =>
   (y -> c) -> c -> EventList.T StrictTime [y] -> sig c
toSignalInitWith :: forall (sig :: * -> *) c y.
Write sig c =>
(y -> c) -> c -> T StrictTime [y] -> sig c
toSignalInitWith = (StrictTime -> c -> sig c)
-> (y -> c) -> c -> T StrictTime [y] -> sig c
forall (sig :: * -> *) c y.
Transform sig c =>
(StrictTime -> c -> sig c)
-> (y -> c) -> c -> T StrictTime [y] -> sig c
PC.toSignalInitWith StrictTime -> c -> sig c
forall (sig :: * -> *) y. Write sig y => StrictTime -> y -> sig y
replicateLong