{-# language OverloadedStrings #-}
module Autolib.ToDoc.Dutch where
import Autolib.Multilingual.Doc
import Data.List (intersperse)
dutch :: (Doc, Doc, Doc)
-> [ Doc ]
-> Doc
dutch :: (Doc, Doc, Doc) -> [Doc] -> Doc
dutch (Doc
op,Doc
sep,Doc
cl) [Doc]
xs = case [Doc]
xs of
[] -> Doc
op Doc -> Doc -> Doc
<+> Doc
cl
[Doc]
_ -> let xs' :: [Doc]
xs' = [Doc] -> [Doc]
forall a. HasCallStack => [a] -> [a]
init [Doc]
xs [Doc] -> [Doc] -> [Doc]
forall a. [a] -> [a] -> [a]
++ [ [Doc] -> Doc
forall a. HasCallStack => [a] -> a
last [Doc]
xs Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
" " ]
in [Doc] -> Doc
vcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (Doc -> Doc -> Doc) -> [Doc] -> [Doc] -> [Doc]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Doc -> Doc -> Doc
(<+>) (Doc
op Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: Doc -> [Doc]
forall a. a -> [a]
repeat Doc
sep) [Doc]
xs' [Doc] -> [Doc] -> [Doc]
forall a. [a] -> [a] -> [a]
++ [ Doc
cl ]
named_dutch_record :: Doc -> [ Doc ] -> Doc
named_dutch_record :: Doc -> [Doc] -> Doc
named_dutch_record Doc
tag [Doc]
docs = Doc -> Doc
group (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$
Doc
tag Doc -> Doc -> Doc
</> ((Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch ( Doc
"{", Doc
comma, Doc
"}" ) [Doc]
docs)
flowing_dutch :: (Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch (Doc
op,Doc
sep,Doc
cl) [Doc]
xs = (Doc
skip Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> Doc
group (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$
case [Doc]
xs of
[] -> Doc
op Doc -> Doc -> Doc
<+> Doc
cl
[Doc]
_ ->
let
xs' :: [Doc]
xs' = [Doc] -> [Doc]
forall a. HasCallStack => [a] -> [a]
init [Doc]
xs [Doc] -> [Doc] -> [Doc]
forall a. Semigroup a => a -> a -> a
<> [ [Doc] -> Doc
forall a. HasCallStack => [a] -> a
last [Doc]
xs Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
" " ]
in [Doc] -> Doc
vcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (Doc -> Doc -> Doc) -> [Doc] -> [Doc] -> [Doc]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ Doc
l Doc
r -> Doc
l Doc -> Doc -> Doc
</> Doc
r)
(Doc
op Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: Doc -> [Doc]
forall a. a -> [a]
repeat Doc
sep) [Doc]
xs'
[Doc] -> [Doc] -> [Doc]
forall a. Semigroup a => a -> a -> a
<> [ Doc
cl ]
dutch_tuple :: [ Doc ] -> Doc
dutch_tuple :: [Doc] -> Doc
dutch_tuple = (Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch ( Doc
"(", Doc
comma, Doc
")" )
dutch_list :: [ Doc ] -> Doc
dutch_list :: [Doc] -> Doc
dutch_list = (Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch ( Doc
"[", Doc
comma, Doc
"]" )
dutch_set :: [ Doc ] -> Doc
dutch_set :: [Doc] -> Doc
dutch_set = (Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch ( Doc
"{", Doc
comma, Doc
"}" )
dutch_semi :: [ Doc ] -> Doc
dutch_semi :: [Doc] -> Doc
dutch_semi = (Doc, Doc, Doc) -> [Doc] -> Doc
flowing_dutch ( Doc
"{", Doc
semi, Doc
"}" )
sepBy :: Doc -> [ Doc ] -> Doc
sepBy :: Doc -> [Doc] -> Doc
sepBy Doc
s [Doc]
ds = [Doc] -> Doc
fsep ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse Doc
s [Doc]
ds
quoted :: Doc -> Doc
quoted :: Doc -> Doc
quoted Doc
d = Char -> Doc
forall {a}. IsString a => Char -> Type a
char Char
'`' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
d Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
forall {a}. IsString a => Char -> Type a
char Char
'\''
(</>) :: Doc -> Doc -> Doc
Doc
l </> :: Doc -> Doc -> Doc
</> Doc
r = (Doc
l Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
" ") Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Integer -> Doc -> Doc
forall {a}. Integral a => a -> Doc -> Doc
nest Integer
2 Doc
r