{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
module Distribution.Fields.Pretty (
PrettyField (..),
showFields,
showFields',
fromParsecFields,
genericFromParsecFields,
prettyFieldLines,
prettySectionArgs,
) where
import Data.Functor.Identity (Identity (..))
import Distribution.Compat.Prelude
import Distribution.Pretty (showToken)
import Prelude ()
import Distribution.Fields.Field (FieldName)
import Distribution.Simple.Utils (fromUTF8BS)
import qualified Distribution.Fields.Parser as P
import qualified Data.ByteString as BS
import qualified Text.PrettyPrint as PP
data PrettyField ann
= PrettyField ann FieldName PP.Doc
| PrettySection ann FieldName [PP.Doc] [PrettyField ann]
deriving (a -> PrettyField b -> PrettyField a
(a -> b) -> PrettyField a -> PrettyField b
(forall a b. (a -> b) -> PrettyField a -> PrettyField b)
-> (forall a b. a -> PrettyField b -> PrettyField a)
-> Functor PrettyField
forall a b. a -> PrettyField b -> PrettyField a
forall a b. (a -> b) -> PrettyField a -> PrettyField b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> PrettyField b -> PrettyField a
$c<$ :: forall a b. a -> PrettyField b -> PrettyField a
fmap :: (a -> b) -> PrettyField a -> PrettyField b
$cfmap :: forall a b. (a -> b) -> PrettyField a -> PrettyField b
Functor, PrettyField a -> Bool
(a -> m) -> PrettyField a -> m
(a -> b -> b) -> b -> PrettyField a -> b
(forall m. Monoid m => PrettyField m -> m)
-> (forall m a. Monoid m => (a -> m) -> PrettyField a -> m)
-> (forall m a. Monoid m => (a -> m) -> PrettyField a -> m)
-> (forall a b. (a -> b -> b) -> b -> PrettyField a -> b)
-> (forall a b. (a -> b -> b) -> b -> PrettyField a -> b)
-> (forall b a. (b -> a -> b) -> b -> PrettyField a -> b)
-> (forall b a. (b -> a -> b) -> b -> PrettyField a -> b)
-> (forall a. (a -> a -> a) -> PrettyField a -> a)
-> (forall a. (a -> a -> a) -> PrettyField a -> a)
-> (forall a. PrettyField a -> [a])
-> (forall a. PrettyField a -> Bool)
-> (forall a. PrettyField a -> Int)
-> (forall a. Eq a => a -> PrettyField a -> Bool)
-> (forall a. Ord a => PrettyField a -> a)
-> (forall a. Ord a => PrettyField a -> a)
-> (forall a. Num a => PrettyField a -> a)
-> (forall a. Num a => PrettyField a -> a)
-> Foldable PrettyField
forall a. Eq a => a -> PrettyField a -> Bool
forall a. Num a => PrettyField a -> a
forall a. Ord a => PrettyField a -> a
forall m. Monoid m => PrettyField m -> m
forall a. PrettyField a -> Bool
forall a. PrettyField a -> Int
forall a. PrettyField a -> [a]
forall a. (a -> a -> a) -> PrettyField a -> a
forall m a. Monoid m => (a -> m) -> PrettyField a -> m
forall b a. (b -> a -> b) -> b -> PrettyField a -> b
forall a b. (a -> b -> b) -> b -> PrettyField a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: PrettyField a -> a
$cproduct :: forall a. Num a => PrettyField a -> a
sum :: PrettyField a -> a
$csum :: forall a. Num a => PrettyField a -> a
minimum :: PrettyField a -> a
$cminimum :: forall a. Ord a => PrettyField a -> a
maximum :: PrettyField a -> a
$cmaximum :: forall a. Ord a => PrettyField a -> a
elem :: a -> PrettyField a -> Bool
$celem :: forall a. Eq a => a -> PrettyField a -> Bool
length :: PrettyField a -> Int
$clength :: forall a. PrettyField a -> Int
null :: PrettyField a -> Bool
$cnull :: forall a. PrettyField a -> Bool
toList :: PrettyField a -> [a]
$ctoList :: forall a. PrettyField a -> [a]
foldl1 :: (a -> a -> a) -> PrettyField a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> PrettyField a -> a
foldr1 :: (a -> a -> a) -> PrettyField a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> PrettyField a -> a
foldl' :: (b -> a -> b) -> b -> PrettyField a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> PrettyField a -> b
foldl :: (b -> a -> b) -> b -> PrettyField a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> PrettyField a -> b
foldr' :: (a -> b -> b) -> b -> PrettyField a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> PrettyField a -> b
foldr :: (a -> b -> b) -> b -> PrettyField a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> PrettyField a -> b
foldMap' :: (a -> m) -> PrettyField a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> PrettyField a -> m
foldMap :: (a -> m) -> PrettyField a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> PrettyField a -> m
fold :: PrettyField m -> m
$cfold :: forall m. Monoid m => PrettyField m -> m
Foldable, Functor PrettyField
Foldable PrettyField
(Functor PrettyField, Foldable PrettyField) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> PrettyField a -> f (PrettyField b))
-> (forall (f :: * -> *) a.
Applicative f =>
PrettyField (f a) -> f (PrettyField a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> PrettyField a -> m (PrettyField b))
-> (forall (m :: * -> *) a.
Monad m =>
PrettyField (m a) -> m (PrettyField a))
-> Traversable PrettyField
(a -> f b) -> PrettyField a -> f (PrettyField b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
PrettyField (m a) -> m (PrettyField a)
forall (f :: * -> *) a.
Applicative f =>
PrettyField (f a) -> f (PrettyField a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> PrettyField a -> m (PrettyField b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> PrettyField a -> f (PrettyField b)
sequence :: PrettyField (m a) -> m (PrettyField a)
$csequence :: forall (m :: * -> *) a.
Monad m =>
PrettyField (m a) -> m (PrettyField a)
mapM :: (a -> m b) -> PrettyField a -> m (PrettyField b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> PrettyField a -> m (PrettyField b)
sequenceA :: PrettyField (f a) -> f (PrettyField a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
PrettyField (f a) -> f (PrettyField a)
traverse :: (a -> f b) -> PrettyField a -> f (PrettyField b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> PrettyField a -> f (PrettyField b)
$cp2Traversable :: Foldable PrettyField
$cp1Traversable :: Functor PrettyField
Traversable)
showFields :: (ann -> [String]) -> [PrettyField ann] -> String
showFields :: (ann -> [String]) -> [PrettyField ann] -> String
showFields rann :: ann -> [String]
rann = (ann -> [String]) -> Int -> [PrettyField ann] -> String
forall ann. (ann -> [String]) -> Int -> [PrettyField ann] -> String
showFields' ann -> [String]
rann 4
showFields' :: (ann -> [String]) -> Int -> [PrettyField ann] -> String
showFields' :: (ann -> [String]) -> Int -> [PrettyField ann] -> String
showFields' rann :: ann -> [String]
rann n :: Int
n = [String] -> String
unlines ([String] -> String)
-> ([PrettyField ann] -> [String]) -> [PrettyField ann] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Opts ann -> [PrettyField ann] -> [String]
forall ann. Opts ann -> [PrettyField ann] -> [String]
renderFields ((ann -> [String]) -> (String -> String) -> Opts ann
forall ann. (ann -> [String]) -> (String -> String) -> Opts ann
Opts ann -> [String]
rann String -> String
indent) where
indent :: String -> String
indent | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 4 = String -> String
indent4
| Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 2 = String -> String
indent2
| Bool
otherwise = (Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
n 1) ' ' String -> String -> String
forall a. [a] -> [a] -> [a]
++)
indent4 :: String -> String
indent4 :: String -> String
indent4 [] = []
indent4 xs :: String
xs = ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: String
xs
indent2 :: String -> String
indent2 :: String -> String
indent2 [] = []
indent2 xs :: String
xs = ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: ' ' Char -> String -> String
forall a. a -> [a] -> [a]
: String
xs
data Opts ann = Opts (ann -> [String]) (String -> String)
renderFields :: Opts ann -> [PrettyField ann] -> [String]
renderFields :: Opts ann -> [PrettyField ann] -> [String]
renderFields opts :: Opts ann
opts fields :: [PrettyField ann]
fields = [Block] -> [String]
flattenBlocks ([Block] -> [String]) -> [Block] -> [String]
forall a b. (a -> b) -> a -> b
$ (PrettyField ann -> Block) -> [PrettyField ann] -> [Block]
forall a b. (a -> b) -> [a] -> [b]
map (Opts ann -> Int -> PrettyField ann -> Block
forall ann. Opts ann -> Int -> PrettyField ann -> Block
renderField Opts ann
opts Int
len) [PrettyField ann]
fields
where
len :: Int
len = Int -> [PrettyField ann] -> Int
forall ann. Int -> [PrettyField ann] -> Int
maxNameLength 0 [PrettyField ann]
fields
maxNameLength :: Int -> [PrettyField ann] -> Int
maxNameLength !Int
acc [] = Int
acc
maxNameLength !Int
acc (PrettyField _ name :: FieldName
name _ : rest :: [PrettyField ann]
rest) = Int -> [PrettyField ann] -> Int
maxNameLength (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
acc (FieldName -> Int
BS.length FieldName
name)) [PrettyField ann]
rest
maxNameLength !Int
acc (PrettySection {} : rest :: [PrettyField ann]
rest) = Int -> [PrettyField ann] -> Int
maxNameLength Int
acc [PrettyField ann]
rest
data Block = Block Margin Margin [String]
data Margin = Margin | NoMargin
deriving Margin -> Margin -> Bool
(Margin -> Margin -> Bool)
-> (Margin -> Margin -> Bool) -> Eq Margin
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Margin -> Margin -> Bool
$c/= :: Margin -> Margin -> Bool
== :: Margin -> Margin -> Bool
$c== :: Margin -> Margin -> Bool
Eq
instance Semigroup Margin where
NoMargin <> :: Margin -> Margin -> Margin
<> NoMargin = Margin
NoMargin
_ <> _ = Margin
Margin
flattenBlocks :: [Block] -> [String]
flattenBlocks :: [Block] -> [String]
flattenBlocks = [Block] -> [String]
go0 where
go0 :: [Block] -> [String]
go0 [] = []
go0 (Block _before :: Margin
_before after :: Margin
after strs :: [String]
strs : blocks :: [Block]
blocks) = [String]
strs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Margin -> [Block] -> [String]
go Margin
after [Block]
blocks
go :: Margin -> [Block] -> [String]
go _surr' :: Margin
_surr' [] = []
go surr' :: Margin
surr' (Block before :: Margin
before after :: Margin
after strs :: [String]
strs : blocks :: [Block]
blocks) = [String] -> [String]
ins ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
strs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Margin -> [Block] -> [String]
go Margin
after [Block]
blocks where
ins :: [String] -> [String]
ins | Margin
surr' Margin -> Margin -> Margin
forall a. Semigroup a => a -> a -> a
<> Margin
before Margin -> Margin -> Bool
forall a. Eq a => a -> a -> Bool
== Margin
Margin = ("" String -> [String] -> [String]
forall a. a -> [a] -> [a]
:)
| Bool
otherwise = [String] -> [String]
forall a. a -> a
id
renderField :: Opts ann -> Int -> PrettyField ann -> Block
renderField :: Opts ann -> Int -> PrettyField ann -> Block
renderField (Opts rann :: ann -> [String]
rann indent :: String -> String
indent) fw :: Int
fw (PrettyField ann :: ann
ann name :: FieldName
name doc :: Doc
doc) =
Margin -> Margin -> [String] -> Block
Block Margin
before Margin
after ([String] -> Block) -> [String] -> Block
forall a b. (a -> b) -> a -> b
$ [String]
comments [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
lines'
where
comments :: [String]
comments = ann -> [String]
rann ann
ann
before :: Margin
before = if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
comments then Margin
NoMargin else Margin
Margin
(lines' :: [String]
lines', after :: Margin
after) = case String -> [String]
lines String
narrow of
[] -> ([ String
name' String -> String -> String
forall a. [a] -> [a] -> [a]
++ ":" ], Margin
NoMargin)
[singleLine :: String
singleLine] | String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
singleLine Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 60
-> ([ String
name' String -> String -> String
forall a. [a] -> [a] -> [a]
++ ": " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
fw Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
name') ' ' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
narrow ], Margin
NoMargin)
_ -> ((String
name' String -> String -> String
forall a. [a] -> [a] -> [a]
++ ":") String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent (String -> [String]
lines (Doc -> String
PP.render Doc
doc)), Margin
Margin)
name' :: String
name' = FieldName -> String
fromUTF8BS FieldName
name
narrow :: String
narrow = Style -> Doc -> String
PP.renderStyle Style
narrowStyle Doc
doc
narrowStyle :: PP.Style
narrowStyle :: Style
narrowStyle = Style
PP.style { lineLength :: Int
PP.lineLength = Style -> Int
PP.lineLength Style
PP.style Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
fw }
renderField opts :: Opts ann
opts@(Opts rann :: ann -> [String]
rann indent :: String -> String
indent) _ (PrettySection ann :: ann
ann name :: FieldName
name args :: [Doc]
args fields :: [PrettyField ann]
fields) = Margin -> Margin -> [String] -> Block
Block Margin
Margin Margin
Margin ([String] -> Block) -> [String] -> Block
forall a b. (a -> b) -> a -> b
$
ann -> [String]
rann ann
ann
[String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[ Doc -> String
PP.render (Doc -> String) -> Doc -> String
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
PP.hsep ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
PP.text (FieldName -> String
fromUTF8BS FieldName
name) Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: [Doc]
args ]
[String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
((String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ Opts ann -> [PrettyField ann] -> [String]
forall ann. Opts ann -> [PrettyField ann] -> [String]
renderFields Opts ann
opts [PrettyField ann]
fields)
genericFromParsecFields
:: Applicative f
=> (FieldName -> [P.FieldLine ann] -> f PP.Doc)
-> (FieldName -> [P.SectionArg ann] -> f [PP.Doc])
-> [P.Field ann]
-> f [PrettyField ann]
genericFromParsecFields :: (FieldName -> [FieldLine ann] -> f Doc)
-> (FieldName -> [SectionArg ann] -> f [Doc])
-> [Field ann]
-> f [PrettyField ann]
genericFromParsecFields f :: FieldName -> [FieldLine ann] -> f Doc
f g :: FieldName -> [SectionArg ann] -> f [Doc]
g = [Field ann] -> f [PrettyField ann]
goMany where
goMany :: [Field ann] -> f [PrettyField ann]
goMany = (Field ann -> f (PrettyField ann))
-> [Field ann] -> f [PrettyField ann]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Field ann -> f (PrettyField ann)
go
go :: Field ann -> f (PrettyField ann)
go (P.Field (P.Name ann :: ann
ann name :: FieldName
name) fls :: [FieldLine ann]
fls) = ann -> FieldName -> Doc -> PrettyField ann
forall ann. ann -> FieldName -> Doc -> PrettyField ann
PrettyField ann
ann FieldName
name (Doc -> PrettyField ann) -> f Doc -> f (PrettyField ann)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FieldName -> [FieldLine ann] -> f Doc
f FieldName
name [FieldLine ann]
fls
go (P.Section (P.Name ann :: ann
ann name :: FieldName
name) secargs :: [SectionArg ann]
secargs fs :: [Field ann]
fs) = ann -> FieldName -> [Doc] -> [PrettyField ann] -> PrettyField ann
forall ann.
ann -> FieldName -> [Doc] -> [PrettyField ann] -> PrettyField ann
PrettySection ann
ann FieldName
name ([Doc] -> [PrettyField ann] -> PrettyField ann)
-> f [Doc] -> f ([PrettyField ann] -> PrettyField ann)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FieldName -> [SectionArg ann] -> f [Doc]
g FieldName
name [SectionArg ann]
secargs f ([PrettyField ann] -> PrettyField ann)
-> f [PrettyField ann] -> f (PrettyField ann)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Field ann] -> f [PrettyField ann]
goMany [Field ann]
fs
prettyFieldLines :: FieldName -> [P.FieldLine ann] -> PP.Doc
prettyFieldLines :: FieldName -> [FieldLine ann] -> Doc
prettyFieldLines _ fls :: [FieldLine ann]
fls = [Doc] -> Doc
PP.vcat
[ String -> Doc
PP.text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ FieldName -> String
fromUTF8BS FieldName
bs
| P.FieldLine _ bs :: FieldName
bs <- [FieldLine ann]
fls
]
prettySectionArgs :: FieldName -> [P.SectionArg ann] -> [PP.Doc]
prettySectionArgs :: FieldName -> [SectionArg ann] -> [Doc]
prettySectionArgs _ = (SectionArg ann -> Doc) -> [SectionArg ann] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map ((SectionArg ann -> Doc) -> [SectionArg ann] -> [Doc])
-> (SectionArg ann -> Doc) -> [SectionArg ann] -> [Doc]
forall a b. (a -> b) -> a -> b
$ \sa :: SectionArg ann
sa -> case SectionArg ann
sa of
P.SecArgName _ bs :: FieldName
bs -> String -> Doc
showToken (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ FieldName -> String
fromUTF8BS FieldName
bs
P.SecArgStr _ bs :: FieldName
bs -> String -> Doc
showToken (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ FieldName -> String
fromUTF8BS FieldName
bs
P.SecArgOther _ bs :: FieldName
bs -> String -> Doc
PP.text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ FieldName -> String
fromUTF8BS FieldName
bs
fromParsecFields :: [P.Field ann] -> [PrettyField ann]
fromParsecFields :: [Field ann] -> [PrettyField ann]
fromParsecFields = Identity [PrettyField ann] -> [PrettyField ann]
forall a. Identity a -> a
runIdentity (Identity [PrettyField ann] -> [PrettyField ann])
-> ([Field ann] -> Identity [PrettyField ann])
-> [Field ann]
-> [PrettyField ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FieldName -> [FieldLine ann] -> Identity Doc)
-> (FieldName -> [SectionArg ann] -> Identity [Doc])
-> [Field ann]
-> Identity [PrettyField ann]
forall (f :: * -> *) ann.
Applicative f =>
(FieldName -> [FieldLine ann] -> f Doc)
-> (FieldName -> [SectionArg ann] -> f [Doc])
-> [Field ann]
-> f [PrettyField ann]
genericFromParsecFields
(Doc -> Identity Doc
forall a. a -> Identity a
Identity (Doc -> Identity Doc)
-> (FieldName -> [FieldLine ann] -> Doc)
-> FieldName
-> [FieldLine ann]
-> Identity Doc
forall a b c d. (a -> b) -> (c -> d -> a) -> c -> d -> b
.: FieldName -> [FieldLine ann] -> Doc
forall ann. FieldName -> [FieldLine ann] -> Doc
prettyFieldLines)
([Doc] -> Identity [Doc]
forall a. a -> Identity a
Identity ([Doc] -> Identity [Doc])
-> (FieldName -> [SectionArg ann] -> [Doc])
-> FieldName
-> [SectionArg ann]
-> Identity [Doc]
forall a b c d. (a -> b) -> (c -> d -> a) -> c -> d -> b
.: FieldName -> [SectionArg ann] -> [Doc]
forall ann. FieldName -> [SectionArg ann] -> [Doc]
prettySectionArgs)
where
(.:) :: (a -> b) -> (c -> d -> a) -> (c -> d -> b)
(f :: a -> b
f .: :: (a -> b) -> (c -> d -> a) -> c -> d -> b
.: g :: c -> d -> a
g) x :: c
x y :: d
y = a -> b
f (c -> d -> a
g c
x d
y)