aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/documentation/lux/type/unit.lux
blob: 08cd1a6d417c91caaeacd184ac4694163db1654f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(.module:
  [library
   [lux (#- and)
    ["$" documentation (#+ documentation:)]
    [control
     ["<>" parser
      ["<.>" code]]]
    [data
     ["." text (#+ \n)
      ["%" format (#+ format)]]]
    [macro
     ["." template]]
    [math
     [number
      ["." ratio]]]]]
  [\\library
   ["." /]])

(documentation: /.Qty
  "A quantity with an associated unit of measurement.")

(template [<name>]
  [(documentation: <name>
     ""
     [(<name> param subject)])]

  [/.+]
  [/.-]
  [/.*]
  [/./]
  )

(documentation: /.Unit
  "A unit of measurement, to qualify numbers with.")

(documentation: /.Scale
  "A scale of magnitude.")

(documentation: /.Pure
  "A pure, unit-less quantity.")

(documentation: /.unit:
  (format "Define a unit of measurement."
          \n "Both the name of the type, and the name of the Unit implementation must be specified.")
  [(unit: .public Feet feet)])

(documentation: /.scale:
  "Define a scale of magnitude."
  [(scale: .public Bajillion bajillion
     [1 1,234,567,890])])

(documentation: /.re_scaled
  ""
  [(re_scaled from to quantity)])

(template [<type> <scale>]
  [(`` (documentation: <scale>
         (let [numerator (value@ [#/.ratio #ratio.numerator] <scale>)
               denominator (value@ [#/.ratio #ratio.denominator] <scale>)]
           (format "The '" (~~ (template.text [<scale>])) "' scale, from " (%.nat numerator) " to " (%.nat denominator) "."))))]

  [/.Kilo /.kilo]
  [/.Mega /.mega]
  [/.Giga /.giga]

  [/.Milli /.milli]
  [/.Micro /.micro]
  [/.Nano /.nano]
  )

(template [<unit>]
  [(`` (documentation: <unit>
         (format "The '" (~~ (template.text [<unit>])) "' unit of meaurement.")))]

  [/.gram]
  [/.meter]
  [/.litre]
  [/.second]
  )

(.def: .public documentation
  (.List $.Module)
  ($.module /._
            ""
            [..Qty
             ..+
             ..-
             ..*
             ../
             ..Unit
             ..Scale
             ..Pure
             ..unit:
             ..scale:
             ..re_scaled
             ..kilo
             ..mega
             ..giga
             ..milli
             ..micro
             ..nano
             ..gram
             ..meter
             ..litre
             ..second
             ($.default /.Gram)
             ($.default /.Meter)
             ($.default /.Litre)
             ($.default /.Second)
             ($.default /.pure)
             ($.default /.number)
             ($.default /.equivalence)
             ($.default /.order)
             ($.default /.enum)
             ($.default /.Kilo)
             ($.default /.Mega)
             ($.default /.Giga)
             ($.default /.Milli)
             ($.default /.Micro)
             ($.default /.Nano)]
            []))