aboutsummaryrefslogtreecommitdiff
path: root/cmd/Main/DistrictInfo.hs
blob: f4f9ff199ce6c2f650dc89cf666f91fd807721c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{-# 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
<https://github.com/bos/aeson/issues/79>.  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