{-# 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 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 = 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 !)