------------------------------------------------------------------------------ -- CPP macros for common instances ------------------------------------------------------------------------------ -- XXX use template haskell instead and include Monoid and IsStream instances -- as well. #define MONADPARALLEL , MonadAsync m #define MONAD_APPLICATIVE_INSTANCE(STREAM,CONSTRAINT) \ instance (Monad m CONSTRAINT) => Applicative (STREAM m) where { \ pure = STREAM . K.yield; \ (<*>) = ap } #define MONAD_COMMON_INSTANCES(STREAM,CONSTRAINT) \ instance Monad m => Functor (STREAM m) where { \ fmap = map }; \ \ instance (MonadBase b m, Monad m CONSTRAINT) => MonadBase b (STREAM m) where {\ liftBase = liftBaseDefault }; \ \ instance (MonadIO m CONSTRAINT) => MonadIO (STREAM m) where { \ liftIO = lift . liftIO }; \ \ instance (MonadThrow m CONSTRAINT) => MonadThrow (STREAM m) where { \ throwM = lift . throwM }; \ \ {- \ instance (MonadError e m CONSTRAINT) => MonadError e (STREAM m) where { \ throwError = lift . throwError; \ catchError m h = \ fromStream $ withCatchError (toStream m) (\e -> toStream $ h e) }; \ -} \ \ instance (MonadReader r m CONSTRAINT) => MonadReader r (STREAM m) where { \ ask = lift ask; \ local f m = fromStream $ K.withLocal f (toStream m) }; \ \ instance (MonadState s m CONSTRAINT) => MonadState s (STREAM m) where { \ get = lift get; \ put x = lift (put x); \ state k = lift (state k) }