From 0a8a5276ab9e5fed4f9d83e415ef87e2f00adcf9 Mon Sep 17 00:00:00 2001 From: meooow25 Date: Wed, 14 Feb 2024 19:15:25 +0530 Subject: [PATCH] Fix filter/filter rules for Text and lazy Text Predicates should be applied in the right order. --- src/Data/Text.hs | 2 +- src/Data/Text/Lazy.hs | 2 +- tests/Tests/Regressions.hs | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Data/Text.hs b/src/Data/Text.hs index 7d2514aa..320219c8 100644 --- a/src/Data/Text.hs +++ b/src/Data/Text.hs @@ -1686,7 +1686,7 @@ filter p = filter_ text p {-# RULES "TEXT filter/filter -> filter" forall p q t. - filter p (filter q t) = filter (\c -> p c && q c) t + filter p (filter q t) = filter (\c -> q c && p c) t #-} -- | /O(n+m)/ Find the first instance of @needle@ (which must be diff --git a/src/Data/Text/Lazy.hs b/src/Data/Text/Lazy.hs index 9b977d67..cd3a0bda 100644 --- a/src/Data/Text/Lazy.hs +++ b/src/Data/Text/Lazy.hs @@ -1690,7 +1690,7 @@ filter p = foldrChunks (chunk . filter_ T.Text p) Empty {-# RULES "TEXT filter/filter -> filter" forall p q t. - filter p (filter q t) = filter (\c -> p c && q c) t + filter p (filter q t) = filter (\c -> q c && p c) t #-} -- | /O(n)/ The 'find' function takes a predicate and a 'Text', and diff --git a/tests/Tests/Regressions.hs b/tests/Tests/Regressions.hs index 0418f4dc..60298c0d 100644 --- a/tests/Tests/Regressions.hs +++ b/tests/Tests/Regressions.hs @@ -176,6 +176,13 @@ t529 = do (T.pack (chr 33 : replicate 31 (chr 0) ++ [chr 65533, chr 0])) (decode (B.pack (33 : replicate 31 0 ++ [128, 0]))) +-- See Github #559 +-- filter/filter fusion rules should apply predicates in the right order. +t559 :: IO () +t559 = do + T.filter undefined (T.filter (const False) "a") @?= "" + LT.filter undefined (LT.filter (const False) "a") @?= "" + tests :: F.TestTree tests = F.testGroup "Regressions" [ F.testCase "hGetContents_crash" hGetContents_crash @@ -193,4 +200,5 @@ tests = F.testGroup "Regressions" , F.testCase "t525" t525 , F.testCase "t528" t528 , F.testCase "t529" t529 + , F.testCase "t559" t559 ]