module Control.Monad.Trans.Stitch
  ( StitchT(..)
  , runStitchT ) where

import Stitch.Types

import Control.Applicative
import Control.Monad.IO.Class
import Control.Monad.Trans.Writer.Strict
import Data.Monoid
import Control.Monad

newtype StitchT m a = StitchT (WriterT Block m a)
  deriving (Functor, Applicative, Monad, MonadIO)

instance (Monad m, Monoid a) => Monoid (StitchT m a) where
  mempty = return mempty
  a `mappend` b = liftM2 mappend a b

runStitchT :: Monad m => StitchT m a -> m (a, Block)
runStitchT (StitchT x) = runWriterT x