{-# LANGUAGE Safe #-}
module System.Mem.StableName.Map
( Map(..)
, empty
, null
, singleton
, member
, notMember
, insert
, insertWith
, insertWith'
, lookup
, find
, findWithDefault
) where
import qualified Prelude
import Prelude hiding (lookup, null)
import System.Mem.StableName.Dynamic
import qualified Data.IntMap as IntMap
import Data.IntMap (IntMap)
import Copilot.Language.Error (impossible)
data Map a = Map { forall a. Map a -> IntMap [(DynStableName, a)]
getMap :: IntMap [(DynStableName, a)]
, forall a. Map a -> Int
getSize :: Int }
empty :: Map a
empty :: forall a. Map a
empty = forall a. IntMap [(DynStableName, a)] -> Int -> Map a
Map forall a. IntMap a
IntMap.empty Int
0
null :: Map a -> Bool
null :: forall a. Map a -> Bool
null (Map IntMap [(DynStableName, a)]
m Int
_) = forall a. IntMap a -> Bool
IntMap.null IntMap [(DynStableName, a)]
m
singleton :: DynStableName -> a -> Map a
singleton :: forall a. DynStableName -> a -> Map a
singleton DynStableName
k a
v =
forall a. IntMap [(DynStableName, a)] -> Int -> Map a
Map (forall a. Int -> a -> IntMap a
IntMap.singleton (DynStableName -> Int
hashDynStableName DynStableName
k) [(DynStableName
k,a
v)]) Int
1
member :: DynStableName -> Map a -> Bool
member :: forall a. DynStableName -> Map a -> Bool
member DynStableName
k Map a
m = case forall v. DynStableName -> Map v -> Maybe v
lookup DynStableName
k Map a
m of
Maybe a
Nothing -> Bool
False
Just a
_ -> Bool
True
notMember :: DynStableName -> Map a -> Bool
notMember :: forall a. DynStableName -> Map a -> Bool
notMember DynStableName
k Map a
m = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. DynStableName -> Map a -> Bool
member DynStableName
k Map a
m
insert :: DynStableName -> a -> Map a -> Map a
insert :: forall a. DynStableName -> a -> Map a -> Map a
insert DynStableName
k a
v Map { getMap :: forall a. Map a -> IntMap [(DynStableName, a)]
getMap = IntMap [(DynStableName, a)]
mp
, getSize :: forall a. Map a -> Int
getSize = Int
sz }
= forall a. IntMap [(DynStableName, a)] -> Int -> Map a
Map (forall a. (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a
IntMap.insertWith forall a. [a] -> [a] -> [a]
(++) (DynStableName -> Int
hashDynStableName DynStableName
k) [(DynStableName
k,a
v)] IntMap [(DynStableName, a)]
mp)
(Int
sz forall a. Num a => a -> a -> a
+ Int
1)
insertWith :: (a -> a -> a) -> DynStableName -> a -> Map a -> Map a
insertWith :: forall a. (a -> a -> a) -> DynStableName -> a -> Map a -> Map a
insertWith a -> a -> a
f DynStableName
k a
v Map { getMap :: forall a. Map a -> IntMap [(DynStableName, a)]
getMap = IntMap [(DynStableName, a)]
mp
, getSize :: forall a. Map a -> Int
getSize = Int
sz }
= forall a. IntMap [(DynStableName, a)] -> Int -> Map a
Map (forall a. (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a
IntMap.insertWith forall {t}. t -> [(DynStableName, a)] -> [(DynStableName, a)]
go (DynStableName -> Int
hashDynStableName DynStableName
k) [(DynStableName
k,a
v)] IntMap [(DynStableName, a)]
mp)
(Int
sz forall a. Num a => a -> a -> a
+ Int
1)
where
go :: t -> [(DynStableName, a)] -> [(DynStableName, a)]
go t
_ ((DynStableName
k',a
v'):[(DynStableName, a)]
kvs)
| DynStableName
k forall a. Eq a => a -> a -> Bool
== DynStableName
k' = (DynStableName
k', a -> a -> a
f a
v a
v') forall a. a -> [a] -> [a]
: [(DynStableName, a)]
kvs
| Bool
otherwise = (DynStableName
k',a
v') forall a. a -> [a] -> [a]
: t -> [(DynStableName, a)] -> [(DynStableName, a)]
go forall a. HasCallStack => a
undefined [(DynStableName, a)]
kvs
go t
_ [] = []
insertWith' :: (a -> a -> a) -> DynStableName -> a -> Map a -> Map a
insertWith' :: forall a. (a -> a -> a) -> DynStableName -> a -> Map a -> Map a
insertWith' a -> a -> a
f DynStableName
k a
v Map { getMap :: forall a. Map a -> IntMap [(DynStableName, a)]
getMap = IntMap [(DynStableName, a)]
mp
, getSize :: forall a. Map a -> Int
getSize = Int
sz }
= forall a. IntMap [(DynStableName, a)] -> Int -> Map a
Map (forall a. (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a
IntMap.insertWith forall {t}. t -> [(DynStableName, a)] -> [(DynStableName, a)]
go (DynStableName -> Int
hashDynStableName DynStableName
k) [(DynStableName
k,a
v)] IntMap [(DynStableName, a)]
mp)
(Int
sz forall a. Num a => a -> a -> a
+ Int
1)
where
go :: t -> [(DynStableName, a)] -> [(DynStableName, a)]
go t
_ ((DynStableName
k',a
v'):[(DynStableName, a)]
kvs)
| DynStableName
k forall a. Eq a => a -> a -> Bool
== DynStableName
k' = let v'' :: a
v'' = a -> a -> a
f a
v a
v' in a
v'' seq :: forall a b. a -> b -> b
`seq` (DynStableName
k', a
v'') forall a. a -> [a] -> [a]
: [(DynStableName, a)]
kvs
| Bool
otherwise = (DynStableName
k', a
v') forall a. a -> [a] -> [a]
: t -> [(DynStableName, a)] -> [(DynStableName, a)]
go forall a. HasCallStack => a
undefined [(DynStableName, a)]
kvs
go t
_ [] = []
lookup :: DynStableName -> Map v -> Maybe v
lookup :: forall v. DynStableName -> Map v -> Maybe v
lookup DynStableName
k (Map IntMap [(DynStableName, v)]
m Int
_) = do
[(DynStableName, v)]
pairs <- forall a. Int -> IntMap a -> Maybe a
IntMap.lookup (DynStableName -> Int
hashDynStableName DynStableName
k) IntMap [(DynStableName, v)]
m
forall a b. Eq a => a -> [(a, b)] -> Maybe b
Prelude.lookup DynStableName
k [(DynStableName, v)]
pairs
find :: DynStableName -> Map v -> v
find :: forall v. DynStableName -> Map v -> v
find DynStableName
k Map v
m = case forall v. DynStableName -> Map v -> Maybe v
lookup DynStableName
k Map v
m of
Maybe v
Nothing -> forall a. String -> String -> a
impossible String
"find" String
"copilot-language"
Just v
x -> v
x
findWithDefault :: v -> DynStableName -> Map v -> v
findWithDefault :: forall v. v -> DynStableName -> Map v -> v
findWithDefault v
dflt DynStableName
k Map v
m = forall b a. b -> (a -> b) -> Maybe a -> b
maybe v
dflt forall a. a -> a
id forall a b. (a -> b) -> a -> b
$ forall v. DynStableName -> Map v -> Maybe v
lookup DynStableName
k Map v
m