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