{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module Xrefcheck.Util.Interpolate
(
interpolateIndentF
, interpolateBlockListF
, interpolateBlockListF'
, interpolateUnlinesF
)
where
import Universum
import Data.Text.Lazy qualified as TL
import Data.Text.Lazy.Builder (fromLazyText, toLazyText)
import Fmt (Buildable, Builder, blockListF, blockListF', indentF, unlinesF)
{-# HLINT ignore "Avoid functions that generate extra trailing newlines/whitespaces" #-}
interpolateIndentF :: HasCallStack => Int -> Builder -> Builder
interpolateIndentF :: HasCallStack => Int -> Builder -> Builder
interpolateIndentF Int
n Builder
b = (case HasCallStack => Text -> Char
Text -> Char
TL.last (Builder -> Text
toLazyText Builder
b) of
Char
'\n' -> Builder -> Builder
forall a. a -> a
id
Char
_ -> HasCallStack => Builder -> Builder
Builder -> Builder
stripLastNewline) (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Builder -> Builder
stripTrailingSpaces (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Int -> Builder -> Builder
indentF Int
n Builder
b
interpolateBlockListF' :: HasCallStack => Text -> (a -> Builder) -> NonEmpty a -> Builder
interpolateBlockListF' :: forall a.
HasCallStack =>
Text -> (a -> Builder) -> NonEmpty a -> Builder
interpolateBlockListF' = HasCallStack => Builder -> Builder
Builder -> Builder
stripLastNewline (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Builder
stripTrailingSpaces (Builder -> Builder)
-> (Text -> (a -> Builder) -> NonEmpty a -> Builder)
-> Text
-> (a -> Builder)
-> NonEmpty a
-> Builder
forall a b c. SuperComposition a b c => a -> b -> c
... Text -> (a -> Builder) -> NonEmpty a -> Builder
forall (f :: * -> *) a.
Foldable f =>
Text -> (a -> Builder) -> f a -> Builder
blockListF'
interpolateBlockListF :: HasCallStack => Buildable a => NonEmpty a -> Builder
interpolateBlockListF :: forall a. (HasCallStack, Buildable a) => NonEmpty a -> Builder
interpolateBlockListF = HasCallStack => Builder -> Builder
Builder -> Builder
stripLastNewline (Builder -> Builder)
-> (NonEmpty a -> Builder) -> NonEmpty a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Builder
stripTrailingSpaces (Builder -> Builder)
-> (NonEmpty a -> Builder) -> NonEmpty a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty a -> Builder
forall (f :: * -> *) a. (Foldable f, Buildable a) => f a -> Builder
blockListF
interpolateUnlinesF :: HasCallStack => Buildable a => NonEmpty a -> Builder
interpolateUnlinesF :: forall a. (HasCallStack, Buildable a) => NonEmpty a -> Builder
interpolateUnlinesF = HasCallStack => Builder -> Builder
Builder -> Builder
stripLastNewline (Builder -> Builder)
-> (NonEmpty a -> Builder) -> NonEmpty a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Builder
stripTrailingSpaces (Builder -> Builder)
-> (NonEmpty a -> Builder) -> NonEmpty a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty a -> Builder
forall (f :: * -> *) a. (Foldable f, Buildable a) => f a -> Builder
unlinesF
stripTrailingSpaces :: Builder -> Builder
stripTrailingSpaces :: Builder -> Builder
stripTrailingSpaces
= Text -> Builder
fromLazyText
(Text -> Builder) -> (Builder -> Text) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
TL.unlines
([Text] -> Text) -> (Builder -> [Text]) -> Builder -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> [Text] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map (Text -> Text
TL.stripEnd)
([Text] -> [Text]) -> (Builder -> [Text]) -> Builder -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
TL.lines
(Text -> [Text]) -> (Builder -> Text) -> Builder -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
toLazyText
stripLastNewline :: HasCallStack => Builder -> Builder
stripLastNewline :: HasCallStack => Builder -> Builder
stripLastNewline
= Text -> Builder
fromLazyText
(Text -> Builder) -> (Builder -> Text) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe (Text -> Text
forall a. HasCallStack => Text -> a
error Text
"stripLastNewline: expected newline to strip")
(Maybe Text -> Text) -> (Builder -> Maybe Text) -> Builder -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Maybe Text
TL.stripSuffix Text
"\n"
(Text -> Maybe Text) -> (Builder -> Text) -> Builder -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
toLazyText