diff options
Diffstat (limited to 'src/Data/Dependent/EnumMap/Strict/Internal.hs')
-rw-r--r-- | src/Data/Dependent/EnumMap/Strict/Internal.hs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/Data/Dependent/EnumMap/Strict/Internal.hs b/src/Data/Dependent/EnumMap/Strict/Internal.hs index 12fb602..f9679df 100644 --- a/src/Data/Dependent/EnumMap/Strict/Internal.hs +++ b/src/Data/Dependent/EnumMap/Strict/Internal.hs @@ -55,7 +55,10 @@ fromList l = -- ** From Ascending Lists --- fromAscList +fromAscList :: Enum1 k => [DSum k v] -> DEnumMap k v +fromAscList l = + DEnumMap (IM.fromAscList (map (\(k :=> v) -> let (i, inf) = fromEnum1 k in (i, KV inf v)) l)) + -- fromAscListWith -- fromAscListWithKey @@ -70,15 +73,22 @@ insert k v (DEnumMap m) = let (i, inf) = fromEnum1 k in DEnumMap (IM.insert i (KV inf v) m) --- insertWith +insertWith :: Enum1 k + => (v a -> v a -> v a) + -> k a -> v a -> DEnumMap k v -> DEnumMap k v +insertWith f k v (DEnumMap m) = + let (i, inf) = fromEnum1 k + in DEnumMap (IM.insertWith + (\(KV _ v1) (KV _ v2) -> KV inf (f (coe1 v1) (coe1 v2))) + i (KV inf v) m) insertWithKey :: Enum1 k => (k a -> v a -> v a -> v a) -> k a -> v a -> DEnumMap k v -> DEnumMap k v insertWithKey f k v (DEnumMap m) = let (i, inf) = fromEnum1 k - in DEnumMap (IM.insertWithKey - (\_ (KV _ v1) (KV _ v2) -> KV inf (f k (coe1 v1) (coe1 v2))) + in DEnumMap (IM.insertWith + (\(KV _ v1) (KV _ v2) -> KV inf (f k (coe1 v1) (coe1 v2))) i (KV inf v) m) -- insertLookupWithKey @@ -288,7 +298,7 @@ toDescList (DEnumMap m) = -- restrictKeys -- withoutKeys -partition :: (forall a. v a -> Bool) -> DEnumMap k v -> (DEnumMap k v, DEnumMap k v) +partition :: (forall a. v a -> Bool) -> DEnumMap k v -> (DEnumMap k v, DEnumMap k v) partition f (DEnumMap m) = bimap DEnumMap DEnumMap (IM.partition (\(KV _ v) -> f v) m) |