content: {-# LANGUAGE
      CPP
    , DeriveDataTypeable
    , FlexibleInstances
    , ScopedTypeVariables
    #-}
  
  #include "overlapping-compat.h"
  
  module Rest.StringMap.Map.Lazy
    ( StringMap
    , fromMap
    , toMap
    , toList
    , fromList
    ) where
  
  import Data.Aeson
  import Data.JSON.Schema
  import Data.Map (Map)
  import Data.String
  import Data.String.ToString
  import Data.Typeable
  import Text.XML.HXT.Arrow.Pickle
  import qualified Data.Map as M
  
  import Rest.StringMap.Util
  
  newtype StringMap a b = StringMap { unM :: Map a b }
    deriving (Eq, Show, Typeable)
  
  fromMap :: Map a b -> StringMap a b
  fromMap = StringMap
  
  toMap :: StringMap a b -> Map a b
  toMap = unM
  
  fromList :: Ord a => [(a,b)] -> StringMap a b
  fromList = StringMap . M.fromList
  
  toList :: StringMap a b -> [(a, b)]
  toList = M.toList . unM
  
  mapKeys :: Ord l => (k -> l) -> StringMap k v -> StringMap l v
  mapKeys f = StringMap . M.mapKeys f . unM
  
  instance XmlPickler b => XmlPickler (StringMap String b) where
    xpickle = pickleStringMap fromList toList
  
  instance OVERLAPPABLE_ (Ord a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringMap a b) where
    xpickle = pickleMap mapKeys mapKeys
  
  instance (ToString a, ToJSON b) => ToJSON (StringMap a b) where
    toJSON = toJSON . M.mapKeys toString . toMap
  
  instance (Ord a, IsString a, FromJSON b) => FromJSON (StringMap a b) where
    parseJSON = fmap (StringMap . M.mapKeys fromString) . parseJSON
  
  instance JSONSchema b => JSONSchema (StringMap a b) where
    schema _ = mapSchema (Proxy :: Proxy b)
  