content: {-# LANGUAGE CPP #-}
  
  -- | Compatibility helpers for the @aeson-2@ migration.
  module Dhall.JSON.Compat (
        objectFromList
      , mapToAscList
      , filterObject
      , lookupObject
      , traverseObjectWithKey
      , objectKeys
      , textToKey
      ) where
  
  import Data.Aeson (Object, Value)
  import Data.Text  (Text)
  
  #if MIN_VERSION_aeson(2,0,0)
  import           Data.Aeson.Key    (Key)
  import qualified Data.Aeson.Key    as Key
  import           Data.Aeson.KeyMap (KeyMap)
  import qualified Data.Aeson.KeyMap as KeyMap
  import           Data.Bifunctor    (first)
  #else
  import           Data.HashMap.Strict (HashMap)
  import qualified Data.HashMap.Strict as HashMap
  import qualified Data.List           as List
  #endif
  
  objectFromList :: [(Text, Value)] -> Object
  #if MIN_VERSION_aeson(2,0,0)
  objectFromList = KeyMap.fromList . map (first Key.fromText)
  #else
  objectFromList = HashMap.fromList
  #endif
  
  filterObject :: (Value -> Bool) -> Object -> Object
  #if MIN_VERSION_aeson(2,0,0)
  filterObject = KeyMap.filter
  #else
  filterObject = HashMap.filter
  #endif
  
  #if MIN_VERSION_aeson(2,0,0)
  mapToAscList :: KeyMap a -> [(Text, a)]
  mapToAscList = map (first Key.toText) . KeyMap.toAscList
  #else
  mapToAscList :: HashMap Text a -> [(Text, a)]
  mapToAscList = List.sortOn fst . HashMap.toList
  #endif
  
  lookupObject :: Text -> Object -> Maybe Value
  #if MIN_VERSION_aeson(2,0,0)
  lookupObject k = KeyMap.lookup (Key.fromText k)
  #else
  lookupObject = HashMap.lookup
  #endif
  
  objectKeys :: Object -> [Text]
  #if MIN_VERSION_aeson(2,0,0)
  objectKeys = map (Key.toText) . KeyMap.keys
  #else
  objectKeys = HashMap.keys
  #endif
  
  #if MIN_VERSION_aeson(2,0,0)
  textToKey :: Text -> Key
  textToKey = Key.fromText
  #else
  textToKey :: Text -> Text
  textToKey = id
  #endif
  
  #if MIN_VERSION_aeson(2,0,0)
  traverseObjectWithKey :: Applicative f => (Key -> v1 -> f v2) -> KeyMap v1 -> f (KeyMap v2)
  traverseObjectWithKey = KeyMap.traverseWithKey
  #else
  traverseObjectWithKey :: Applicative f => (Text -> v1 -> f v2) -> HashMap Text v1 -> f (HashMap Text v2)
  traverseObjectWithKey = HashMap.traverseWithKey
  #endif
  