flexiwrap-0.1.0: Data/Flex/WrappedMonad.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
-- .$Header: c:/Source/Haskell/Wrapper/Data/Flex/RCS/WrappedMonad.hs,v 1.3 2011/03/05 01:12:40 dosuser Exp dosuser $
module Data.Flex.WrappedMonad where
import Control.Monad (liftM, ap)
import Data.Type.Apply
import Data.Type.TList
import Data.Flex.Applicative (FWApplicative,
FWPure, WrapPure(..),
FWCombine, WrapCombine(..)
)
import Data.Flex.Functor (FWFunctor, FWFmap, WrapFmap(..))
import Data.Flex.WrapT (inFlexiWrapT,
FlexiWrapT(..), FWT, inFlexiWrapT2,
)
data FWWrapMonad = FWWrapMonad
data FWMonadFunctor = FWMonadFunctor
data FWMonadApplicative = FWMonadApplicative
instance FWFunctor (FWT (FWWrapMonad :*: s) f) FWMonadFunctor
instance FWFunctor (FWT (FWMonadFunctor :*: s) f) FWMonadFunctor
instance Monad m => Apply (FWFmap t m) FWMonadFunctor (WrapFmap (FWT t m)) where
apply _ _ = WrapFmap (inFlexiWrapT . liftM)
instance FWApplicative (FWT (FWWrapMonad :*: s) f) FWMonadApplicative
instance FWApplicative (FWT (FWMonadApplicative :*: s) f) FWMonadApplicative
-- instance (Functor m, Monad m) =>
instance Monad m =>
Apply (FWPure t m) FWMonadApplicative (WrapPure (FWT t m))
where
apply _ _ = WrapPure (FlexiWrapT . return)
-- instance (Functor m, Monad m) =>
instance Monad m =>
Apply (FWCombine t m) FWMonadApplicative (WrapCombine (FWT t m))
where
apply _ _ = WrapCombine (inFlexiWrapT2 ap)
-- vim: expandtab:tabstop=4:shiftwidth=4