summaryrefslogtreecommitdiffstats
path: root/src/Blessings.hs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2022-01-08 03:52:50 +0100
committertv <tv@krebsco.de>2022-01-09 22:42:22 +0100
commitd778004a4ab25ac212bf71e2a2f42beed2ea89b7 (patch)
tree2dce28c619bab20465224a3aaf0b7a3b167a5899 /src/Blessings.hs
parent4ce648a9eeeda9167ee57c2185911e81d45883b6 (diff)
Blessings: don't compare during drop and take
This fixes divergence caused when calling drop or take on Append with infinite left hand side.
Diffstat (limited to 'src/Blessings.hs')
-rw-r--r--src/Blessings.hs25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/Blessings.hs b/src/Blessings.hs
index 344fac2..3c00f38 100644
--- a/src/Blessings.hs
+++ b/src/Blessings.hs
@@ -272,10 +272,16 @@ instance Blessable a => Blessable (Blessings a) where
drop n = \case
Append t1 t2 ->
- case compare n (Bless.length t1) of
- LT -> Bless.drop n t1 <> t2
- EQ -> t2
- GT -> Bless.drop (n - Bless.length t1) t2
+ let
+ n1 = Bless.length (Bless.take n t1)
+ n2 = n - n1
+ t1' = Bless.drop n1 t1
+ t2' = Bless.drop n2 t2
+ isEmpty = (==0) . Bless.length . Bless.take 1
+ in
+ if n1 /= n || isEmpty t1'
+ then t2'
+ else Append t1' t2'
Plain s ->
Plain (Bless.drop n s)
SGR pm t ->
@@ -285,10 +291,13 @@ instance Blessable a => Blessable (Blessings a) where
take n = \case
Append t1 t2 ->
- case compare n (Bless.length t1) of
- LT -> Bless.take n t1
- EQ -> t1
- GT -> t1 <> Bless.take (n - Bless.length t1) t2
+ let
+ t1' = Bless.take n t1
+ n' = n - Bless.length t1'
+ in
+ if n' > 0
+ then t1' <> Bless.take n' t2
+ else t1'
Plain s ->
Plain (Bless.take n s)
SGR pm t ->