diff options
| author | tv <tv@krebsco.de> | 2026-03-19 22:09:58 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-03-19 22:39:41 +0100 |
| commit | fdeb641fde5f82c3ad617c5c801ab40955fe62af (patch) | |
| tree | 3b741944473738fb79f4f50943b3975c20a6e9a1 /src/Blessings/Extra.hs | |
| parent | 131e4f0ccf655095d13b05f69acdaa1c22b9e6d4 (diff) | |
blessings: 2 -> 3
Diffstat (limited to 'src/Blessings/Extra.hs')
| -rw-r--r-- | src/Blessings/Extra.hs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/Blessings/Extra.hs b/src/Blessings/Extra.hs new file mode 100644 index 0000000..caa8e2d --- /dev/null +++ b/src/Blessings/Extra.hs @@ -0,0 +1,37 @@ +module Blessings.Extra where + +import Blessings +import Data.Char (isPrint,showLitChar) +import Data.MonoTraversable (Element, oall, ofoldMap) +import Data.Sequences (singleton) +import Data.String (fromString) + +quoteSpecials :: (Blessable a, Element a ~ Char) => Blessings a -> Blessings a +quoteSpecials = cataBlessings quoteSpecialsPlain SGR Append + +quoteSpecialsPlain :: (Blessable a, Element a ~ Char) => a -> Blessings a +quoteSpecialsPlain = + quoteSpecialsPlain' id (SGR [35]) + +quoteSpecialsPlain' + :: forall a. (Blessable a, Element a ~ Char) + => (Blessings a -> Blessings a) + -> (Blessings a -> Blessings a) + -> a + -> Blessings a +quoteSpecialsPlain' printable unprintable s = + if oall isPrint s + then printable (Plain s) + else normalize (ofoldMap quoteSpecialChar s) + where + + quoteSpecialChar :: (Blessable a, Element a ~ Char) => Char -> Blessings a + quoteSpecialChar c = + if isPrint c + then printable (Plain (singleton c)) + else unprintable (Plain (fromString (showLitChar' c))) + + showLitChar' :: Char -> String + showLitChar' = \case + '\ESC' -> "^[" + c -> showLitChar c "" |
