summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikolaj Konarski <mikolaj.konarski@funktory.com>2025-05-10 17:43:26 +0200
committerMikolaj Konarski <mikolaj.konarski@funktory.com>2025-05-10 17:43:26 +0200
commit66930fd97543746bfa9a74635985ec765bd3c2e0 (patch)
tree24d73e9205734897677a11c5dc21755ab3b0376d
parent4a447d98ec35141c2c55bea6ad45488a2e56401a (diff)
Implement folds
-rw-r--r--src/Data/Dependent/EnumMap/Strict/Internal.hs39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/Data/Dependent/EnumMap/Strict/Internal.hs b/src/Data/Dependent/EnumMap/Strict/Internal.hs
index add7fa5..2726a50 100644
--- a/src/Data/Dependent/EnumMap/Strict/Internal.hs
+++ b/src/Data/Dependent/EnumMap/Strict/Internal.hs
@@ -409,18 +409,39 @@ mapAccumRWithKey f acc0 (DEnumMap m) =
-- * Folds
--- foldr
--- foldl
--- foldrWithKey
--- foldlWithKey
--- foldMapWithKey
+foldr :: (forall a. v a -> acc -> acc) -> acc -> DEnumMap k v -> acc
+foldr f acc0 (DEnumMap m) = IM.foldr (\(KV _ v) acc -> f v acc) acc0 m
+
+foldl :: (forall a. acc -> v a -> acc) -> acc -> DEnumMap k v -> acc
+foldl f acc0 (DEnumMap m) = IM.foldl (\acc (KV _ v) -> f acc v) acc0 m
+
+foldrWith :: Enum1 k => (forall a. k a -> v a -> acc -> acc) -> acc -> DEnumMap k v -> acc
+foldrWith f acc0 (DEnumMap m) =
+ IM.foldrWithKey (\i (KV inf v) acc -> case toEnum1 i inf of Some k -> f k (coe1 v) acc) acc0 m
+
+foldlWith :: Enum1 k => (forall a. acc -> k a -> v a -> acc) -> acc -> DEnumMap k v -> acc
+foldlWith f acc0 (DEnumMap m) =
+ IM.foldlWithKey (\acc i (KV inf v) -> case toEnum1 i inf of Some k -> f acc k (coe1 v)) acc0 m
+
+foldMapWithKey :: (Monoid m, Enum1 k) => (forall a. k a -> v a -> m) -> DEnumMap k v -> m
+foldMapWithKey f (DEnumMap m) =
+ IM.foldMapWithKey (\i (KV inf v) -> case toEnum1 i inf of Some k -> f k (coe1 v)) m
-- ** Strict folds
--- foldr'
--- foldl'
--- foldrWithKey'
--- foldlWithKey'
+foldr' :: (forall a. v a -> acc -> acc) -> acc -> DEnumMap k v -> acc
+foldr' f acc0 (DEnumMap m) = IM.foldr' (\(KV _ v) acc -> f v acc) acc0 m
+
+foldl' :: (forall a. acc -> v a -> acc) -> acc -> DEnumMap k v -> acc
+foldl' f acc0 (DEnumMap m) = IM.foldl' (\acc (KV _ v) -> f acc v) acc0 m
+
+foldrWith' :: Enum1 k => (forall a. k a -> v a -> acc -> acc) -> acc -> DEnumMap k v -> acc
+foldrWith' f acc0 (DEnumMap m) =
+ IM.foldrWithKey' (\i (KV inf v) acc -> case toEnum1 i inf of Some k -> f k (coe1 v) acc) acc0 m
+
+foldlWith' :: Enum1 k => (forall a. acc -> k a -> v a -> acc) -> acc -> DEnumMap k v -> acc
+foldlWith' f acc0 (DEnumMap m) =
+ IM.foldlWithKey' (\acc i (KV inf v) -> case toEnum1 i inf of Some k -> f acc k (coe1 v)) acc0 m
-- * Conversion