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

(documentation: /.Semaphore
  "A tool for controlling access to resources by multiple concurrent processes.")

(documentation: /.semaphore
  ""
  [(semaphore initial_open_positions)])

(documentation: /.wait!
  (format "Wait on a semaphore until there are open positions."
          \n "After finishing your work, you must 'signal' to the semaphore that you're done.")
  [(wait! semaphore)])

(documentation: /.signal!
  "Signal to a semaphore that you're done with your work, and that there is a new open position."
  [(signal! semaphore)])

(documentation: /.Mutex
  "A mutual-exclusion lock that can only be acquired by one process at a time.")

(documentation: /.mutex
  "Creates a brand-new mutex."
  [(mutex _)])

(documentation: /.synchronize!
  "Runs the procedure with exclusive control of the mutex."
  [(synchronize! mutex procedure)])

(documentation: /.limit
  "Produce a limit for a barrier.")

(documentation: /.Limit
  "A limit for barriers.")

(documentation: /.Barrier
  "A barrier that blocks all processes from proceeding until a given number of processes are parked at the barrier.")

(documentation: /.block!
  "Wait on a barrier until all processes have arrived and met the barrier's limit.")

(.def: .public documentation
  (.List $.Module)
  ($.module /._
            ""
            [..Semaphore
             ..semaphore
             ..wait!
             ..signal!
             ..Mutex
             ..mutex
             ..synchronize!
             ..limit
             ..Limit
             ..Barrier
             ..block!
             ($.default /.semaphore_is_maxed_out)
             ($.default /.barrier)]
            []))
