{-# LANGUAGE RecursiveDo #-}
module Data.MonadicStreamFunction.ArrowLoop where

import Data.MonadicStreamFunction.Core

-- External
import Control.Arrow
import Control.Category (Category(..))
import Control.Monad
import Control.Monad.Fix

instance (Monad m, MonadFix m) => ArrowLoop (MStreamF m) where
  -- loop :: a (b, d) (c, d) -> a b c
  loop sf = MStreamF $ \a -> do
              rec ((b,c), sf') <- unMStreamF sf (a, c)
              return (b, loop sf')