summaryrefslogtreecommitdiff
path: root/src/Data/Dependent
diff options
context:
space:
mode:
Diffstat (limited to 'src/Data/Dependent')
-rw-r--r--src/Data/Dependent/EnumMap/Strict/Internal.hs20
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)