[Git][ghc/ghc][master] base: generalize delete{Firsts,}By
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC Commits: b230d549 by mangoiv at 2025-12-16T15:17:45-05:00 base: generalize delete{Firsts,}By When we delete{Firsts,}By we should not require the lists to be the same type. This is an especially useful generalisation in the case of deleteFirstsBy because we can skip an invocation of the map function. This change was discussed on the core-libraries-committee's bug tracker at https://github.com/haskell/core-libraries-committee/issues/372. - - - - - 6 changed files: - libraries/base/changelog.md - libraries/ghc-internal/src/GHC/Internal/Data/OldList.hs - testsuite/tests/interface-stability/base-exports.stdout - testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs - testsuite/tests/interface-stability/base-exports.stdout-mingw32 - testsuite/tests/interface-stability/base-exports.stdout-ws-32 Changes: ===================================== libraries/base/changelog.md ===================================== @@ -11,6 +11,7 @@ * Modify the implementation of `Data.List.sortOn` to use `(>)` instead of `compare`. ([CLC proposal #332](https://github.com/haskell/core-libraries-committee/issues/332)) * Add `thenA` and `thenM`. ([CLC proposal #351](https://github.com/haskell/core-libraries-committee/issues/351)) * Fix bug where `naturalAndNot` was incorrectly truncating results ([CLC proposal #350](github.com/haskell/core-libraries-committee/issues/350)) + * generalize `deleteBy` and `deleteFirstsBy` ([CLC proposal 372](https://github.com/haskell/core-libraries-committee/issues/372)) * Remove extra laziness from `Data.Bifunctor.Bifunctor` instances for all tuples to have the same laziness as their `Data.Functor.Functor` counterparts (i.e. they became more strict than before) ([CLC proposal #339](https://github.com/haskell/core-libraries-committee/issues/339)) * Adjust the strictness of `Data.List.iterate'` to be more reasonable: every element of the output list is forced to WHNF when the `(:)` containing it is forced. ([CLC proposal #335)](https://github.com/haskell/core-libraries-committee/issues/335) * Add `nubOrd` / `nubOrdBy` to `Data.List` and `Data.List.NonEmpty`. ([CLC proposal #336](https://github.com/haskell/core-libraries-committee/issues/336)) ===================================== libraries/ghc-internal/src/GHC/Internal/Data/OldList.hs ===================================== @@ -576,7 +576,7 @@ delete = deleteBy (==) -- -- >>> deleteBy (/=) 5 [5, 5, 4, 3, 5, 2] -- [5,5,3,5,2] -deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a] +deleteBy :: (a -> b -> Bool) -> a -> [b] -> [b] deleteBy _ _ [] = [] deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys @@ -1342,7 +1342,7 @@ unzip7 = foldr (\(a,b,c,d,e,f,g) ~(as,bs,cs,ds,es,fs,gs) -> -- -- >>> deleteFirstsBy (/=) [1..10] [1, 3, 5] -- [4,5,6,7,8,9,10] -deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] +deleteFirstsBy :: (a -> b -> Bool) -> [b] -> [a] -> [b] deleteFirstsBy eq = foldl (flip (deleteBy eq)) -- | The 'group' function takes a list and returns a list of lists such ===================================== testsuite/tests/interface-stability/base-exports.stdout ===================================== @@ -1323,8 +1323,8 @@ module Data.List where concatMap :: forall (t :: * -> *) a b. GHC.Internal.Data.Foldable.Foldable t => (a -> [b]) -> t a -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] @@ -8898,8 +8898,8 @@ module GHC.OldList where concatMap :: forall a b. (a -> [b]) -> [a] -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] ===================================== testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs ===================================== @@ -1323,8 +1323,8 @@ module Data.List where concatMap :: forall (t :: * -> *) a b. GHC.Internal.Data.Foldable.Foldable t => (a -> [b]) -> t a -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] @@ -11944,8 +11944,8 @@ module GHC.OldList where concatMap :: forall a b. (a -> [b]) -> [a] -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] ===================================== testsuite/tests/interface-stability/base-exports.stdout-mingw32 ===================================== @@ -1323,8 +1323,8 @@ module Data.List where concatMap :: forall (t :: * -> *) a b. GHC.Internal.Data.Foldable.Foldable t => (a -> [b]) -> t a -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] @@ -9116,8 +9116,8 @@ module GHC.OldList where concatMap :: forall a b. (a -> [b]) -> [a] -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] ===================================== testsuite/tests/interface-stability/base-exports.stdout-ws-32 ===================================== @@ -1323,8 +1323,8 @@ module Data.List where concatMap :: forall (t :: * -> *) a b. GHC.Internal.Data.Foldable.Foldable t => (a -> [b]) -> t a -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] @@ -8898,8 +8898,8 @@ module GHC.OldList where concatMap :: forall a b. (a -> [b]) -> [a] -> [b] cycle :: forall a. GHC.Internal.Stack.Types.HasCallStack => [a] -> [a] delete :: forall a. GHC.Internal.Classes.Eq a => a -> [a] -> [a] - deleteBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> a -> [a] -> [a] - deleteFirstsBy :: forall a. (a -> a -> GHC.Internal.Types.Bool) -> [a] -> [a] -> [a] + deleteBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> a -> [b] -> [b] + deleteFirstsBy :: forall a b. (a -> b -> GHC.Internal.Types.Bool) -> [b] -> [a] -> [b] drop :: forall a. GHC.Internal.Types.Int -> [a] -> [a] dropWhile :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] dropWhileEnd :: forall a. (a -> GHC.Internal.Types.Bool) -> [a] -> [a] View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b230d549a59d7ada282796ddd37545cf... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b230d549a59d7ada282796ddd37545cf... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Marge Bot (@marge-bot)