NatMap.hs (1520B)
1 module Naturals.NatMap where 2 3 import Data.Bifunctor (first) 4 import Data.IntMap.Strict (IntMap) 5 import Data.IntMap.Strict qualified as IntMap 6 7 import Naturals.Nat 8 9 -- | A wrapper around @IntMap@ that uses @Nat@s instead of @Int@s. 10 -- 11 -- Only an subset of the @IntMap@ API is provided, but that subset shall grow 12 -- as needed. 13 newtype NatMap a = NatMap {unNatMap :: IntMap a} 14 deriving (Eq, Functor, Foldable, Traversable) 15 deriving newtype (Show) 16 17 empty :: NatMap a 18 empty = NatMap IntMap.empty 19 20 singleton :: Nat -> a -> NatMap a 21 singleton k = NatMap . IntMap.singleton (fromNat k) 22 23 fromList :: [(Nat, a)] -> NatMap a 24 fromList = NatMap . IntMap.fromList . map (first fromNat) 25 26 insert :: Nat -> a -> NatMap a -> NatMap a 27 insert k v = NatMap . IntMap.insert (fromNat k) v . unNatMap 28 29 delete :: Nat -> NatMap a -> NatMap a 30 delete k = NatMap . IntMap.delete (fromNat k) . unNatMap 31 32 adjust :: (a -> a) -> Nat -> NatMap a -> NatMap a 33 adjust f k = NatMap . IntMap.adjust f (fromNat k) . unNatMap 34 35 update :: (a -> Maybe a) -> Nat -> NatMap a -> NatMap a 36 update f k = NatMap . IntMap.update f (fromNat k) . unNatMap 37 38 alter :: (Maybe a -> Maybe a) -> Nat -> NatMap a -> NatMap a 39 alter f k = NatMap . IntMap.alter f (fromNat k) . unNatMap 40 41 lookup :: Nat -> NatMap a -> Maybe a 42 lookup k = IntMap.lookup (fromNat k) . unNatMap 43 44 member :: Nat -> NatMap a -> Bool 45 member k = IntMap.member (fromNat k) . unNatMap 46 47 null :: NatMap a -> Bool 48 null = IntMap.null . unNatMap 49 50 size :: NatMap a -> Nat 51 size = toNat . IntMap.size . unNatMap