(.using
  [library
   [lux {"-" private}
    ["$" documentation {"+" documentation:}]
    [data
     ["[0]" text {"+" \n}
      ["%" format {"+" format}]]]
    [macro
     ["[0]" template]]]]
  [\\library
   ["[0]" /]])

(documentation: /.inspection
  "A best-effort attempt to generate a textual representation of a value, without knowing its type."
  [(inspection value)])

(documentation: /.representation
  "A best-effort attempt to generate a textual representation of a value, while knowing its type."
  [(representation type value)])

(documentation: /.private
  "Allows access to un-exported definitions in other modules."
  ["Module A"
   (def: .private (secret_definition input)
     (-> ??? ???)
     (foo (bar (baz input))))
   "Module B"
   ((/.private secret_definition) my_input)])

(documentation: /.log!
  "Prints/writes a message to standard output."
  [(log! message)])

(documentation: /.:hole
  (format "A typed 'hole'."
          \n "Reveals the type expected of the expression that should go in the hole.")
  [(: (-> Nat Text)
      (function (_ number)
        (:hole)))
   "=>"
   .Text])

(documentation: /.here
  "Shows the names and values of local bindings available around the call to 'here'."
  [(let [foo 123
         bar +456
         baz +789.0]
     (: Any
        (here)))
   "=>"
   "foo: +123"
   "bar: +456"
   "baz: +789.0"
   []]
  ["Can optionally be given a list of definitions to focus on."
   "These definitions to focus on can include custom format to represent the values."
   (let [foo 123
         bar +456
         baz +789.0]
     (: Any
        (here [foo %.nat] baz)))
   "=>"
   "foo: 123"
   "baz: +789.0"
   []])

(.def: .public documentation
  (.List $.Module)
  ($.module /._
            ""
            [..inspection
             ..representation
             ..private
             ..log!
             ..:hole
             ..here
             ($.default /.cannot_represent_value)
             ($.default /.type_hole)
             ($.default /.unknown_local_binding)]
            []))
