{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE StandaloneDeriving #-} {-# OPTIONS_GHC -fno-warn-deprecations #-} -- FIXME: to be removed when dropping GHC-7.6 support module Hcompta.Chart where import Control.DeepSeq (NFData(..)) import Data.Data (Data) import Data.Eq (Eq(..)) import Data.Functor (Functor(..)) -- import Data.List (concat) -- import Data.List.NonEmpty (NonEmpty(..)) import qualified Data.Map.Strict as Data.Map import Data.Monoid (Monoid(..)) import Data.Typeable import Text.Show (Show(..)) import Prelude (($)) import Hcompta.Account (Account(..)) import Hcompta.Lib.TreeMap (TreeMap) import qualified Hcompta.Lib.TreeMap as TreeMap -- import Hcompta.Tag (Tag) import qualified Hcompta.Tag as Tag data Account account => Chart account = Chart { chart_accounts :: TreeMap (Account_Section account) Tag.Tags -- , chart_tags :: TreeMap Tag.Section [Account] } deriving instance ( Account account , Data account ) => Data (Chart account) deriving instance ( Account account , Eq account ) => Eq (Chart account) deriving instance ( Account account , Show account ) => Show (Chart account) deriving instance Typeable1 Chart -- FIXME: use 'Typeable' when dropping GHC-7.6 support instance Account account => Monoid (Chart account) where mempty = Chart { chart_accounts = mempty -- , chart_tags = mempty } mappend x y = Chart { chart_accounts = chart_accounts x `mappend` chart_accounts y -- , chart_tags = chart_tags x `mappend` chart_tags y } instance ( NFData account , Account account ) => NFData (Chart account) where rnf (Chart a) = rnf a -- | Return the 'Tag.Tags' associated with -- the given 'Account_Path' -- in the given 'Chart'. account_tags :: Account account => account -> Chart account -> Tag.Tags account_tags acct chart = Tag.Tags $ Data.Map.unionsWith mappend $ fmap Tag.unTags $ TreeMap.find_along (account_path acct) $ chart_accounts chart {- -- | Return the 'Account's associated with -- the given 'Tag' -- in the given 'Chart'. tag_accounts :: Tag -> Chart -> [Account] tag_accounts (p:|ps, value) chart = concat $ TreeMap.find_along (p:|ps `mappend` [value]) $ chart_tags chart -}