{-# LANGUAGE OverloadedStrings #-}
module Language.Ginger.BuiltinsAutodoc
where
import Control.Monad.Identity (Identity, runIdentity)
import qualified Data.Map.Strict as Map
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Vector as Vector
import Language.Haskell.TH (getDoc, putDoc, DocLoc (..), DecsQ, runIO)
import Language.Ginger.Interpret
import Language.Ginger.Interpret.Builtins
( builtinGlobals
, builtinGlobalsNonJinja
, builtinBoolAttribs
, builtinIntAttribs
, builtinFloatAttribs
, builtinStringAttribs
, builtinListAttribs
, builtinDictAttribs
, BuiltinAttribs
)
import Language.Ginger.Interpret.DefEnv
( builtinTests
, builtinFilters
)
import Language.Ginger.AST
import Language.Ginger.Value
markdownToHaddock :: Text -> Text
markdownToHaddock :: Text -> Text
markdownToHaddock =
HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
Text.replace Text
"'" Text
"\\'" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
Text.replace Text
"\"" Text
"\\\"" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
Text.replace Text
"`" Text
"@" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
Text.replace Text
"```" Text
"@"
addHaddockFromFile :: FilePath -> DecsQ
addHaddockFromFile :: String -> DecsQ
addHaddockFromFile String
path = do
String
src <- IO String -> Q String
forall a. IO a -> Q a
runIO (IO String -> Q String) -> IO String -> Q String
forall a b. (a -> b) -> a -> b
$ String -> IO String
readFile String
path
String
doc <- String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"" (Maybe String -> String) -> Q (Maybe String) -> Q String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DocLoc -> Q (Maybe String)
getDoc DocLoc
ModuleDoc
DocLoc -> String -> Q ()
putDoc DocLoc
ModuleDoc (String -> Q ()) -> String -> Q ()
forall a b. (a -> b) -> a -> b
$ String
doc String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
src
[Dec] -> DecsQ
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
extractAttribs :: Monoid a
=> BuiltinAttribs a Identity
-> [(Identifier, Value Identity)]
=
a -> BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
forall a.
a -> BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribsWith a
forall a. Monoid a => a
mempty
extractAttribsWith :: a
-> BuiltinAttribs a Identity
-> [(Identifier, Value Identity)]
a
dummy =
Map Identifier (Value Identity) -> [(Identifier, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Identifier (Value Identity) -> [(Identifier, Value Identity)])
-> (BuiltinAttribs a Identity -> Map Identifier (Value Identity))
-> BuiltinAttribs a Identity
-> [(Identifier, Value Identity)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((a -> Identity (Either RuntimeError (Value Identity)))
-> Value Identity)
-> BuiltinAttribs a Identity -> Map Identifier (Value Identity)
forall a b. (a -> b) -> Map Identifier a -> Map Identifier b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (
(RuntimeError -> Value Identity)
-> (Value Identity -> Value Identity)
-> Either RuntimeError (Value Identity)
-> Value Identity
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Value Identity
forall a. HasCallStack => String -> a
error (String -> Value Identity)
-> (RuntimeError -> String) -> RuntimeError -> Value Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RuntimeError -> String
forall a. Show a => a -> String
show) Value Identity -> Value Identity
forall a. a -> a
id (Either RuntimeError (Value Identity) -> Value Identity)
-> ((a -> Identity (Either RuntimeError (Value Identity)))
-> Either RuntimeError (Value Identity))
-> (a -> Identity (Either RuntimeError (Value Identity)))
-> Value Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Identity (Either RuntimeError (Value Identity))
-> Either RuntimeError (Value Identity)
forall a. Identity a -> a
runIdentity (Identity (Either RuntimeError (Value Identity))
-> Either RuntimeError (Value Identity))
-> ((a -> Identity (Either RuntimeError (Value Identity)))
-> Identity (Either RuntimeError (Value Identity)))
-> (a -> Identity (Either RuntimeError (Value Identity)))
-> Either RuntimeError (Value Identity)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((a -> Identity (Either RuntimeError (Value Identity)))
-> a -> Identity (Either RuntimeError (Value Identity))
forall a b. (a -> b) -> a -> b
$ a
dummy)
)
builtinsAutodoc :: DecsQ
builtinsAutodoc :: DecsQ
builtinsAutodoc = do
String
doc <- String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"" (Maybe String -> String) -> Q (Maybe String) -> Q String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DocLoc -> Q (Maybe String)
getDoc DocLoc
ModuleDoc
DocLoc -> String -> Q ()
putDoc DocLoc
ModuleDoc (String -> Q ()) -> String -> Q ()
forall a b. (a -> b) -> a -> b
$
String
doc String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n== __List Of Builtin Globals__\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\nThese are available in Jinja, and work (mostly) the same in Ginger.\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines (((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem Maybe Text
forall a. Maybe a
Nothing Text
"globals_jinja_") (Map Identifier (Value Identity) -> [(Identifier, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Identifier (Value Identity) -> [(Identifier, Value Identity)])
-> Map Identifier (Value Identity)
-> [(Identifier, Value Identity)]
forall a b. (a -> b) -> a -> b
$ (Expr -> GingerT Identity (Value Identity))
-> Map Identifier (Value Identity)
forall (m :: * -> *).
Monad m =>
(Expr -> GingerT m (Value m)) -> Map Identifier (Value m)
builtinGlobals Expr -> GingerT Identity (Value Identity)
forall (m :: * -> *). Monad m => Expr -> GingerT m (Value m)
evalE)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n== __List Of Extension Globals__\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\nThese are not available in Jinja\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines (((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem Maybe Text
forall a. Maybe a
Nothing Text
"globals_ginger_") (Map Identifier (Value Identity) -> [(Identifier, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Identifier (Value Identity) -> [(Identifier, Value Identity)])
-> Map Identifier (Value Identity)
-> [(Identifier, Value Identity)]
forall a b. (a -> b) -> a -> b
$ (Expr -> GingerT Identity (Value Identity))
-> Map Identifier (Value Identity)
forall (m :: * -> *).
Monad m =>
(Expr -> GingerT m (Value m)) -> Map Identifier (Value m)
builtinGlobalsNonJinja Expr -> GingerT Identity (Value Identity)
forall (m :: * -> *). Monad m => Expr -> GingerT m (Value m)
evalE)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n== __List Of Builtin Attributes__\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== Bool\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bool") Text
"globals_bool_")
(Bool
-> BuiltinAttribs Bool Identity -> [(Identifier, Value Identity)]
forall a.
a -> BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribsWith Bool
False BuiltinAttribs Bool Identity
forall (m :: * -> *). Monad m => BuiltinAttribs Bool m
builtinBoolAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== Int\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"int") Text
"globals_int_")
(Integer
-> BuiltinAttribs Integer Identity
-> [(Identifier, Value Identity)]
forall a.
a -> BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribsWith Integer
0 BuiltinAttribs Integer Identity
forall (m :: * -> *). Monad m => BuiltinAttribs Integer m
builtinIntAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== Float\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"float") Text
"globals_float_")
(Double
-> BuiltinAttribs Double Identity -> [(Identifier, Value Identity)]
forall a.
a -> BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribsWith Double
0 BuiltinAttribs Double Identity
forall (m :: * -> *). Monad m => BuiltinAttribs Double m
builtinFloatAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== String\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"string") Text
"globals_string_")
(BuiltinAttribs Text Identity -> [(Identifier, Value Identity)]
forall a.
Monoid a =>
BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribs BuiltinAttribs Text Identity
forall (m :: * -> *). Monad m => BuiltinAttribs Text m
builtinStringAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== List\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"list") Text
"globals_list_")
(BuiltinAttribs (Vector (Value Identity)) Identity
-> [(Identifier, Value Identity)]
forall a.
Monoid a =>
BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribs BuiltinAttribs (Vector (Value Identity)) Identity
forall (m :: * -> *).
Monad m =>
BuiltinAttribs (Vector (Value m)) m
builtinListAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n=== Dict\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
(((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"dict") Text
"globals_dict_")
(BuiltinAttribs (Map Scalar (Value Identity)) Identity
-> [(Identifier, Value Identity)]
forall a.
Monoid a =>
BuiltinAttribs a Identity -> [(Identifier, Value Identity)]
extractAttribs BuiltinAttribs (Map Scalar (Value Identity)) Identity
forall (m :: * -> *).
Monad m =>
BuiltinAttribs (Map Scalar (Value m)) m
builtinDictAttribs)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n== __List Of Builtin Filters__\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\nThese will only work in a filter context, not via procedure call syntax.\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines (((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem Maybe Text
forall a. Maybe a
Nothing Text
"filters_") (Map Identifier (Value Identity) -> [(Identifier, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Identifier (Value Identity) -> [(Identifier, Value Identity)])
-> Map Identifier (Value Identity)
-> [(Identifier, Value Identity)]
forall a b. (a -> b) -> a -> b
$ Map Identifier (Value Identity)
forall (m :: * -> *). Monad m => Map Identifier (Value m)
builtinFilters)) String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\n\n== __List Of Builtin Tests__\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\nThese will only work in a test context (e.g., an @is@-expression).\n\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\nSome of these tests shadow globals of the same name but different functionality.\n\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines (((Identifier, Value Identity) -> String)
-> [(Identifier, Value Identity)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem Maybe Text
forall a. Maybe a
Nothing Text
"tests_") (Map Identifier (Value Identity) -> [(Identifier, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Identifier (Value Identity) -> [(Identifier, Value Identity)])
-> Map Identifier (Value Identity)
-> [(Identifier, Value Identity)]
forall a b. (a -> b) -> a -> b
$ Map Identifier (Value Identity)
forall (m :: * -> *). Monad m => Map Identifier (Value m)
builtinTests))
[Dec] -> DecsQ
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
where
goTy :: TypeDoc -> Text
goTy :: TypeDoc -> Text
goTy TypeDoc
TypeDocAny = Text
"any"
goTy TypeDoc
TypeDocNone = Text
"none"
goTy (TypeDocSingle Text
t) = Text
t
goTy (TypeDocAlternatives Vector Text
ts) =
Text
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
Text.intercalate Text
" | " (Vector Text -> [Text]
forall a. Vector a -> [a]
Vector.toList (Vector Text -> [Text]) -> Vector Text -> [Text]
forall a b. (a -> b) -> a -> b
$ Vector Text
ts) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"]"
goItemHeading :: Maybe Text -> Text -> Text -> [Text]
goItemHeading :: Maybe Text -> Text -> Text -> [Text]
goItemHeading Maybe Text
namespaceMay Text
prefix Text
name =
[ Text
""
, Text
"#" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
prefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" (Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".") Maybe Text
namespaceMay Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"#"
, Text
""
, Text
"=== " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" (Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".") Maybe Text
namespaceMay Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name
]
goArgSig :: ArgumentDoc -> Text
goArgSig :: ArgumentDoc -> Text
goArgSig ArgumentDoc
arg =
ArgumentDoc -> Text
argumentDocName ArgumentDoc
arg Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" (Text
"=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (ArgumentDoc -> Maybe Text
argumentDocDefault ArgumentDoc
arg) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
Text -> (TypeDoc -> Text) -> Maybe TypeDoc -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" ((Text
" : " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text) -> (TypeDoc -> Text) -> TypeDoc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeDoc -> Text
goTy) (ArgumentDoc -> Maybe TypeDoc
argumentDocType ArgumentDoc
arg)
goArgDesc :: ArgumentDoc -> [Text]
goArgDesc :: ArgumentDoc -> [Text]
goArgDesc ArgumentDoc
arg =
[ Text
"[@" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ArgumentDoc -> Text
argumentDocName ArgumentDoc
arg Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"@]:" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ArgumentDoc -> Text
argumentDocDescription ArgumentDoc
arg ]
goDocumentedItem :: Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem :: Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureDoc
d) =
let qualifiedName :: Text
qualifiedName = Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" (Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".") Maybe Text
namespaceMay Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Identifier -> Text
identifierName Identifier
name
in
Text -> String
Text.unpack (Text -> String) -> ([Text] -> Text) -> [Text] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
Text.unlines ([Text] -> String) -> [Text] -> String
forall a b. (a -> b) -> a -> b
$
Maybe Text -> Text -> Text -> [Text]
goItemHeading Maybe Text
namespaceMay Text
prefix
(Identifier -> Text
identifierName Identifier
name)
[Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
[ Text
""
, Text
"@" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Identifier -> Text
identifierName Identifier
name
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (Text -> [Text] -> Text
Text.intercalate Text
", " ([Text] -> Text)
-> (Vector ArgumentDoc -> [Text]) -> Vector ArgumentDoc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArgumentDoc -> Text) -> [ArgumentDoc] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map ArgumentDoc -> Text
goArgSig ([ArgumentDoc] -> [Text])
-> (Vector ArgumentDoc -> [ArgumentDoc])
-> Vector ArgumentDoc
-> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector ArgumentDoc -> [ArgumentDoc]
forall a. Vector a -> [a]
Vector.toList (Vector ArgumentDoc -> Text) -> Vector ArgumentDoc -> Text
forall a b. (a -> b) -> a -> b
$ ProcedureDoc -> Vector ArgumentDoc
procedureDocArgs ProcedureDoc
d) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (TypeDoc -> Text) -> Maybe TypeDoc -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" ((Text
" → " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text) -> (TypeDoc -> Text) -> TypeDoc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeDoc -> Text
goTy) (ProcedureDoc -> Maybe TypeDoc
procedureDocReturnType ProcedureDoc
d)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"@"
, Text
""
]
[Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
( if Text
qualifiedName Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
/= ProcedureDoc -> Text
procedureDocName ProcedureDoc
d Bool -> Bool -> Bool
&&
Identifier -> Text
identifierName Identifier
name Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
/= ProcedureDoc -> Text
procedureDocName ProcedureDoc
d then
[ Text
"Alias for [" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ProcedureDoc -> Text
procedureDocName ProcedureDoc
d Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"](#" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
prefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ProcedureDoc -> Text
procedureDocName ProcedureDoc
d Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
]
else
( if Vector ArgumentDoc -> Bool
forall a. Vector a -> Bool
Vector.null (ProcedureDoc -> Vector ArgumentDoc
procedureDocArgs ProcedureDoc
d) then
[ ]
else
[ Text
""
, Text
"==== Arguments"
, Text
""
] [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
((ArgumentDoc -> [Text]) -> [ArgumentDoc] -> [Text]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ArgumentDoc -> [Text]
goArgDesc ([ArgumentDoc] -> [Text])
-> (Vector ArgumentDoc -> [ArgumentDoc])
-> Vector ArgumentDoc
-> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector ArgumentDoc -> [ArgumentDoc]
forall a. Vector a -> [a]
Vector.toList (Vector ArgumentDoc -> [Text]) -> Vector ArgumentDoc -> [Text]
forall a b. (a -> b) -> a -> b
$ ProcedureDoc -> Vector ArgumentDoc
procedureDocArgs ProcedureDoc
d) [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
[ Text
"" ]
) [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
[ Text
""
, Text -> Text
markdownToHaddock (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ ProcedureDoc -> Text
procedureDocDescription ProcedureDoc
d
]
)
goItem :: Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem :: Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, DictV Map Scalar (Value Identity)
subitems) =
let qualifiedName :: Text
qualifiedName = Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" (Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".") Maybe Text
namespaceMay Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Identifier -> Text
identifierName Identifier
name
heading :: String
heading = Text -> String
Text.unpack (Text -> String) -> ([Text] -> Text) -> [Text] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
Text.unlines ([Text] -> String) -> [Text] -> String
forall a b. (a -> b) -> a -> b
$
[ Text
""
, Text
"=== Module \\'" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
qualifiedName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\\'"
]
in
String
heading String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
unlines
[ Maybe Text -> Text -> (Identifier, Value Identity) -> String
goItem (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
qualifiedName) Text
prefix (Text -> Identifier
Identifier Text
k, Value Identity
v)
| (StringScalar Text
k, Value Identity
v) <- Map Scalar (Value Identity) -> [(Scalar, Value Identity)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map Scalar (Value Identity)
subitems
]
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureV (NativeProcedure ObjectID
_ (Just ProcedureDoc
d) [(Maybe Identifier, Value Identity)]
-> Context Identity
-> SomePRNG
-> Identity (Either RuntimeError (Value Identity))
_)) =
Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureDoc
d)
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureV Procedure Identity
NamespaceProcedure) =
Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureDoc
namespaceProcedureDoc)
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, FilterV (NativeFilter (Just ProcedureDoc
d) FilterFunc Identity
_)) =
Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureDoc
d)
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, TestV (NativeTest (Just ProcedureDoc
d) TestFunc Identity
_)) =
Maybe Text -> Text -> (Identifier, ProcedureDoc) -> String
goDocumentedItem Maybe Text
namespaceMay Text
prefix (Identifier
name, ProcedureDoc
d)
goItem Maybe Text
namespaceMay Text
prefix (Identifier
name, Value Identity
_) =
Text -> String
Text.unpack (Text -> String) -> ([Text] -> Text) -> [Text] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
Text.unlines ([Text] -> String) -> [Text] -> String
forall a b. (a -> b) -> a -> b
$
Maybe Text -> Text -> Text -> [Text]
goItemHeading Maybe Text
namespaceMay Text
prefix (Identifier -> Text
identifierName Identifier
name)