-- |
-- Module      : Control.Monad.Trans.Writer.JSONable
-- Copyright   : (c) Justus Sagemüller 2017
-- License     : GPL v3
-- 
-- Maintainer  : (@) jsag $ hvl.no
-- Stability   : experimental
-- Portability : portable
-- 

{-# LANGUAGE DeriveFunctor         #-}
{-# LANGUAGE DeriveFoldable        #-}
{-# LANGUAGE DeriveTraversable     #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE UndecidableInstances  #-}

module Control.Monad.Trans.Writer.JSONable where

import Data.Aeson
import Flat
import GHC.Generics
import Data.Semigroup


data WriterT l m a = WriterT { runWriterT :: m (a, l) }
  deriving (Functor, Foldable, Traversable, Generic)
instance (ToJSON (m (a,l))) => ToJSON (WriterT l m a)
instance (FromJSON (m (a,l))) => FromJSON (WriterT l m a)
instance (Flat (m (a,l))) => Flat (WriterT l m a)
instance (Semigroup (m (a,l))) => Semigroup (WriterT l m a) where
  WriterT x <> WriterT y = WriterT $ x<>y
instance (Semigroup (m (a,l)), Monoid (m (a,l))) => Monoid (WriterT l m a) where
  mempty = WriterT mempty
  mappend = (<>)