]> Git — Sourcephile - haskell/symantic-compta.git/blob - src/Symantic/Compta/Input/Chart.hs
init
[haskell/symantic-compta.git] / src / Symantic / Compta / Input / Chart.hs
1 module Symantic.Compta.Input.Chart where
2
3 import Control.Applicative (Applicative(..))
4 import Control.Monad (Monad(..))
5 import Data.Foldable (foldr)
6 import Data.Functor (Functor)
7 import Data.Monoid (Monoid(..))
8 import Data.Ord (Ord(..))
9 import Data.Semigroup (Semigroup(..))
10 import Prelude (error)
11 import qualified Control.Monad.Trans.Writer as MT
12 import qualified GHC.Exts as GHC
13
14 import Symantic.Compta.Lang.Rebindable
15 import Symantic.Compta.Lang
16 import Symantic.Compta.Calc.Chart
17
18 -- * Type 'ChartM'
19 -- | A 'Monad' to construct a 'Chart'.
20 newtype ChartM k v m a = ChartM { unChartM ::
21 MT.WriterT (v, Chart k v) m a
22 } deriving newtype (Functor, Applicative, Monad)
23
24 runChartM :: Monad m => ChartM k v m a -> m (Chart k v)
25 runChartM chM = do
26 (_a, (_v, ch)) <- MT.runWriterT (unChartM chM)
27 return ch
28
29 instance (Ord k, Monoid v, Monad m) => Semigroup (ChartM k v m a) where
30 (<>) = (Control.Monad.>>)
31 instance (Ord k, Monoid v, Monad m, Monoid a) => Monoid (ChartM k v m a) where
32 mempty = return mempty
33 instance
34 ( Ord k
35 , Monoid v
36 , Monad m
37 , Monoid a
38 ) => GHC.IsList (ChartM k v m a) where
39 type Item (ChartM k v m a) = ChartM k v m a
40 fromList = mconcat
41 fromListN _n = mconcat
42 toList = return