yeamer-0.1.1.0: Control/Monad/Trans/Writer/JSONable.hs
-- |
-- 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 = (<>)