primitive-containers-0.3.0: src/Data/Dependent/Map/Lifted/Lifted.hs
{-# language GeneralizedNewtypeDeriving #-}
{-# language PolyKinds #-}
{-# language RankNTypes #-}
{-# language TypeFamilies #-}
module Data.Dependent.Map.Lifted.Lifted
( Map
, singleton
, lookup
, toList
, fromList
, mapMaybe
, mapMaybeWithKey
) where
import Prelude hiding (lookup)
import Data.Aeson (FromJSON,ToJSON)
import Data.Primitive (Array)
import Data.Semigroup (Semigroup)
import Data.Exists (EqForallPoly,EqForeach,OrdForeach)
import Data.Exists (OrdForallPoly,DependentPair,ShowForall,ShowForeach,ToSing)
import Data.Exists (ToJSONKeyForall,FromJSONKeyExists,ToJSONForeach,SemigroupForeach)
import Data.Exists (FromJSONForeach)
import GHC.Exts (IsList)
import qualified Data.Aeson as AE
import qualified Data.Dependent.Map.Internal as I
import qualified Data.Semigroup as SG
import qualified GHC.Exts
newtype Map k v = Map (I.Map Array Array k v)
singleton :: k a -> v a -> Map k v
singleton f v = Map (I.singleton f v)
lookup :: OrdForallPoly k => k a -> Map k v -> Maybe (v a)
lookup k (Map x) = I.lookup k x
fromList :: OrdForallPoly k => [DependentPair k v] -> Map k v
fromList xs = Map (I.fromList xs)
fromListN :: OrdForallPoly k => Int -> [DependentPair k v] -> Map k v
fromListN n xs = Map (I.fromListN n xs)
toList :: Map k v -> [DependentPair k v]
toList (Map x) = I.toList x
mapMaybe ::
(forall a. v a -> Maybe (w a))
-> Map k v
-> Map k w
mapMaybe f (Map m) = Map (I.mapMaybe f m)
mapMaybeWithKey ::
(forall a. k a -> v a -> Maybe (w a))
-> Map k v
-> Map k w
mapMaybeWithKey f (Map m) = Map (I.mapMaybeWithKey f m)
instance OrdForallPoly k => IsList (Map k v) where
type Item (Map k v) = DependentPair k v
fromListN = fromListN
fromList = fromList
toList = toList
instance (ShowForall k, ToSing k, ShowForeach v) => Show (Map k v) where
showsPrec p (Map s) = I.showsPrec p s
instance (EqForallPoly k, ToSing k, EqForeach v) => Eq (Map k v) where
Map x == Map y = I.equals x y
instance (OrdForallPoly k, ToSing k, OrdForeach v) => Ord (Map k v) where
compare (Map x) (Map y) = I.compare x y
instance (ToSing k, OrdForallPoly k, SemigroupForeach v) => Semigroup (Map k v) where
Map x <> Map y = Map (I.append x y)
instance (ToSing k, OrdForallPoly k, SemigroupForeach v) => Monoid (Map k v) where
mempty = Map I.empty
mappend = (SG.<>)
instance (ToSing k, ToJSONKeyForall k, ToJSONForeach v) => ToJSON (Map k v) where
toJSON (Map m) = I.toJSON m
instance (ToSing k, FromJSONKeyExists k, FromJSONForeach v, OrdForallPoly k) => FromJSON (Map k v) where
parseJSON v = fmap Map (I.parseJSON v)