From 66930fd97543746bfa9a74635985ec765bd3c2e0 Mon Sep 17 00:00:00 2001 From: Mikolaj Konarski Date: Sat, 10 May 2025 17:43:26 +0200 Subject: Implement folds --- src/Data/Dependent/EnumMap/Strict/Internal.hs | 39 ++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'src') 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 -- cgit v1.2.3-70-g09d2