{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DeriveGeneric #-} module Data ( Key(..) , RW(..) ) where import Data.Aeson (FromJSON(..), ToJSON(..), ToJSONKey(..), genericToEncoding) import Data.Aeson.Types (toJSONKeyText) import Data.Text (pack) import GHC.Generics import qualified JSON (defaultOptions) class RW a b where get :: b -> a set :: a -> b -> b update :: (a -> a) -> b -> b update f v = set (f (get v)) v newtype Key a = Key Int deriving (Eq, Ord, Enum, Read, Show, Generic) instance FromJSON (Key a) instance ToJSON (Key a) where toEncoding = genericToEncoding JSON.defaultOptions instance ToJSONKey (Key a) where toJSONKey = toJSONKeyText (pack . \(Key n) -> show n)