packages feed

synthesizer-llvm-0.7: src/Synthesizer/LLVM/Causal/ProcessPrivate.hs

module Synthesizer.LLVM.Causal.ProcessPrivate where

import Control.Arrow (Arrow, arr, (>>>), (&&&), )


firstNext ::
   (Functor m) =>
   (context -> a -> s -> m (b, s)) ->
   context -> (a, c) -> s -> m ((b, c), s)
firstNext next context (b,d) s0 =
   fmap
      (\(c,s1) -> ((c,d), s1))
      (next context b s0)

loopNext ::
   (Monad m) =>
   (context -> (a,c) -> state -> m ((b,c), state)) ->
   context -> a -> (c, state) -> m (b, (c, state))
loopNext next ctx a0 (c0,s0) = do
   ((b1,c1), s1) <- next ctx (a0,c0) s0
   return (b1,(c1,s1))

feedbackControlledAux ::
   Arrow arrow =>
   arrow ((ctrl,a),c) b ->
   arrow (ctrl,b) c ->
   arrow ((ctrl,a),c) (b,c)
feedbackControlledAux forth back =
   arr (fst.fst) &&& forth  >>>  arr snd &&& back