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))