module Control.RMonad.Fix (RMonadFix (..), fix) where
import Control.RMonad.Prelude
import Control.Monad.Fix (fix)
import qualified Control.Monad.Fix as M
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Suitable
class RMonad m => RMonadFix m where
mfix :: Suitable m a => (a -> m a) -> m a
instance RMonadFix Maybe where
mfix = M.mfix
instance RMonadFix [] where
mfix = M.mfix
instance RMonadFix IO where
mfix = M.mfix
instance RMonadFix ((->) r) where
mfix = M.mfix
instance RMonadFix Set where
mfix f = withResConstraints $ \SetConstraints ->
case Set.minView (fix (f . Set.findMin)) of
Nothing -> Set.empty
Just (x, _) -> Set.insert x (mfix (Set.deleteMin . f))