{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} module Main.DistrictInfo ( DistrictInfo(..) , di2df , df2di ) where import Control.Arrow ((&&&)) import GHC.Generics (Generic) import Data.Aeson (FromJSON, ToJSON) import qualified Data.HashMap.Strict as HM import Malodivo.Budget (DistrictFunds) import Malodivo.Types.District (District) {-| We use this data type instead of 'DistrictFunds', because maps other than @HashMap Text _@ are hard to decode/encode see . Anyway, we still have type-checked typos-proof structure, and build 'DistrictFunds' out of it. -} data DistrictInfo = DistrictInfo { name :: District , amount :: Integer } deriving (Generic, FromJSON, ToJSON) di2df :: [DistrictInfo] -> DistrictFunds di2df = HM.fromListWith (+) . map (name &&& amount) df2di :: DistrictFunds -> [DistrictInfo] df2di = map (\(n, a) -> DistrictInfo {name = n, amount = a}) . HM.toList