module Synthesizer.LLVM.CausalParameterized.Controlled (
Ctrl.process,
processCtrlRate,
) where
import qualified Synthesizer.LLVM.CausalParameterized.Process as CausalP
import qualified Synthesizer.LLVM.Causal.Controlled as Ctrl
import qualified Synthesizer.LLVM.Parameterized.Signal as SigP
import qualified LLVM.DSL.Parameter as Param
import qualified LLVM.Extra.Tuple as Tuple
import qualified LLVM.Extra.Marshal as Marshal
import qualified LLVM.Extra.Memory as Memory
import qualified LLVM.Extra.ScalarOrVector as SoV
import qualified LLVM.Core as LLVM
import LLVM.Core (Value, IsFloating)
processCtrlRate ::
(Ctrl.C parameter a b,
Memory.C parameter,
Marshal.C r, Tuple.ValueOf r ~ Value r,
IsFloating r, SoV.IntegerConstant r,
LLVM.CmpRet r, LLVM.IsPrimitive r) =>
Param.T p r ->
(Param.T p r -> SigP.T p parameter) ->
CausalP.T p a b
processCtrlRate reduct ctrlGen =
CausalP.applyFst Ctrl.process
(SigP.interpolateConstant reduct (ctrlGen reduct))