{-# LANGUAGE ScopedTypeVariables, Rank2Types #-}
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
-- .$Header: c:/Source/Haskell/Wrapper/Data/Flex/RCS/Monad.hs,v 1.1 2010/03/10 01:57:35 dosuser Exp dosuser $
module Data.Flex.Monad where

-- import Data.Flex.Applicative (WrapPure(..))

class FWMonad (m :: * -> *) r | m -> r

data FWDefaultMonad = FWDefaultMonad

data FWReturn t (m :: * -> *) = FWReturn

newtype WrapReturn m = WrapReturn {unwrapReturn :: forall a. a -> m a}
wrapReturn :: (forall a. a -> m a) -> WrapReturn m
wrapReturn = WrapReturn
{- GHC 6.6.1 can't cope with this version of unwrapReturn
type WrapReturn = WrapPure
wrapReturn :: (forall a. a -> m a) -> WrapReturn m
wrapReturn = WrapPure
unwrapReturn :: WrapReturn m -> (forall a. a -> m a)
unwrapReturn = unwrapPure
-}

data FWBind t (m :: * -> *) = FWBind

newtype WrapBind m =
    WrapBind {unwrapBind :: forall a b. m a -> (a -> m b) -> m b}

wrapBind :: (forall a b. m a -> (a -> m b) -> m b) -> WrapBind m
wrapBind = WrapBind

-- vim: expandtab:tabstop=4:shiftwidth=4