diff options
author | Mikolaj Konarski <mikolaj.konarski@funktory.com> | 2025-05-10 17:43:26 +0200 |
---|---|---|
committer | Mikolaj Konarski <mikolaj.konarski@funktory.com> | 2025-05-10 17:43:26 +0200 |
commit | 66930fd97543746bfa9a74635985ec765bd3c2e0 (patch) | |
tree | 24d73e9205734897677a11c5dc21755ab3b0376d | |
parent | 4a447d98ec35141c2c55bea6ad45488a2e56401a (diff) |
Implement folds
-rw-r--r-- | src/Data/Dependent/EnumMap/Strict/Internal.hs | 39 |
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 |