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

import Stitch.Types

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

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

instance (Applicative m, Semigroup a) => Semigroup (StitchT m a) where
  a <> b = (<>) <$> a <*> b

instance (Applicative m, Monoid a, Semigroup a) => Monoid (StitchT m a) where
  mempty = pure mempty
  mappend = (<>)

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