33 lines
918 B
Haskell
33 lines
918 B
Haskell
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
|
|
|
module Data.Universe.Instances.Reverse.JSON
|
|
(
|
|
) where
|
|
|
|
import ClassyPrelude
|
|
|
|
import Data.Aeson
|
|
import Data.Aeson.Types (Parser)
|
|
|
|
import qualified Data.HashSet as HashSet
|
|
import qualified Data.HashMap.Strict as HashMap
|
|
import Data.HashMap.Strict ((!))
|
|
|
|
import Data.Universe
|
|
|
|
import Control.Monad.Fail
|
|
|
|
|
|
instance (Eq a, Hashable a, Finite a, ToJSON b, ToJSONKey a) => ToJSON (a -> b) where
|
|
toJSON f = toJSON $ HashMap.fromList [(k, f k) | k <- universeF]
|
|
|
|
instance (Eq a, Hashable a, Finite a, FromJSON b, FromJSONKey a) => FromJSON (a -> b) where
|
|
parseJSON val = asObject <|> asConst
|
|
where
|
|
asObject = do
|
|
vMap <- parseJSON val :: Parser (HashMap a b)
|
|
unless (HashSet.fromMap (HashMap.map (const ()) vMap) == HashSet.fromList universeF) $
|
|
fail "Not all required keys found"
|
|
return (vMap !)
|
|
asConst = const <$> parseJSON val
|