module Codec.CBOR.Cuddle.Pretty.Utils where

import Data.Text qualified as T
import Prettyprinter (Doc, flatAlt, layoutCompact, space)
import Prettyprinter.Render.Text (renderStrict)

renderedLen :: Doc ann -> Int
renderedLen :: forall ann. Doc ann -> Int
renderedLen = Text -> Int
T.length (Text -> Int) -> (Doc ann -> Text) -> Doc ann -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SimpleDocStream Any -> Text
forall ann. SimpleDocStream ann -> Text
renderStrict (SimpleDocStream Any -> Text)
-> (Doc ann -> SimpleDocStream Any) -> Doc ann -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> SimpleDocStream Any
forall ann1 ann2. Doc ann1 -> SimpleDocStream ann2
layoutCompact

softspace :: Doc ann
softspace :: forall ann. Doc ann
softspace = Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
flatAlt Doc ann
forall ann. Doc ann
space Doc ann
forall a. Monoid a => a
mempty

spaces :: Int -> Doc ann
spaces :: forall ann. Int -> Doc ann
spaces Int
i = [Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ Int -> Doc ann -> [Doc ann]
forall a. Int -> a -> [a]
replicate Int
i Doc ann
forall ann. Doc ann
softspace

fillLeft :: Int -> Doc ann -> Doc ann
fillLeft :: forall ann. Int -> Doc ann -> Doc ann
fillLeft Int
len Doc ann
doc = Int -> Doc ann
forall ann. Int -> Doc ann
spaces (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- Doc ann -> Int
forall ann. Doc ann -> Int
renderedLen Doc ann
doc) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
doc

fillRight :: Int -> Doc ann -> Doc ann
fillRight :: forall ann. Int -> Doc ann -> Doc ann
fillRight Int
len Doc ann
doc = Doc ann
doc Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
spaces (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- Doc ann -> Int
forall ann. Doc ann -> Int
renderedLen Doc ann
doc)