diff options
Diffstat (limited to 'src/Blessings.hs')
-rw-r--r-- | src/Blessings.hs | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/Blessings.hs b/src/Blessings.hs index 26a0666..559db3e 100644 --- a/src/Blessings.hs +++ b/src/Blessings.hs @@ -47,13 +47,16 @@ instance Functor Blessings where instance Semigroup (Blessings a) where t <> Empty = t Empty <> t = t - Append t1 t2 <> Append t3 t4 = t1 <> t2 <> t3 <> t4 - Append t1 t2 <> t3 = t1 <> t2 <> t3 + Append t1 t2 <> t3 = Append t1 (t2 <> t3) t1 <> t2 = Append t1 t2 instance Monoid (Blessings a) where mempty = Empty + mconcat = \case + x:[] -> x + x:xs -> Append x $ mconcat xs + [] -> Empty instance IsString a => IsString (Blessings a) where @@ -151,8 +154,8 @@ instance IsPm Underline where rec xs = case filter (`elem` ([4,24] :: [Word8])) xs of [] -> Nothing xs' -> case last xs' of - 1 -> Just Underline - 22 -> Just NoUnderline + 4 -> Just Underline + 24 -> Just NoUnderline _ -> error "filter broken in fromPm :: Pm -> Maybe Underline" @@ -273,10 +276,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 -> @@ -286,10 +295,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 -> |