module Symantic.Compta.Input.Chart where import Control.Applicative (Applicative(..)) import Control.Monad (Monad(..)) import Data.Foldable (foldr) import Data.Functor (Functor) import Data.Monoid (Monoid(..)) import Data.Ord (Ord(..)) import Data.Semigroup (Semigroup(..)) import Prelude (error) import qualified Control.Monad.Trans.Writer as MT import qualified GHC.Exts as GHC import Symantic.Compta.Lang.Rebindable import Symantic.Compta.Lang import Symantic.Compta.Calc.Chart -- * Type 'ChartM' -- | A 'Monad' to construct a 'Chart'. newtype ChartM k v m a = ChartM { unChartM :: MT.WriterT (v, Chart k v) m a } deriving newtype (Functor, Applicative, Monad) runChartM :: Monad m => ChartM k v m a -> m (Chart k v) runChartM chM = do (_a, (_v, ch)) <- MT.runWriterT (unChartM chM) return ch instance (Ord k, Monoid v, Monad m) => Semigroup (ChartM k v m a) where (<>) = (Control.Monad.>>) instance (Ord k, Monoid v, Monad m, Monoid a) => Monoid (ChartM k v m a) where mempty = return mempty instance ( Ord k , Monoid v , Monad m , Monoid a ) => GHC.IsList (ChartM k v m a) where type Item (ChartM k v m a) = ChartM k v m a fromList = mconcat fromListN _n = mconcat toList = return