naturals

natural numbers in Haskell
git clone git://git.rr3.xyz/naturals
Log | Files | Refs

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