{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}


module Data.Monoid.Monad.IO
    ( module System.IO
    , module Data.Monoid.Reducer
    , module Control.Monad
    )  where

import System.IO
import Data.Monoid.Reducer
import Control.Monad
import Control.Monad.ST
import Control.Concurrent.STM

instance Monoid m => Monoid (IO m) where
    mempty = return mempty
    mappend = liftM2 mappend

instance Monoid m => Reducer m (IO m) where
    unit = return

instance Monoid m => Reducer (ST RealWorld m) (IO m) where
    unit = stToIO

instance Monoid m => Reducer (STM m) (IO m) where
    unit = atomically