aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/locale/language.lux
blob: e6ded5090bb62867270ad99d8e29c1ddcbc17673 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
(.module:
  [library
   [lux #*
    ["_" test (#+ Test)]
    [abstract
     [monad (#+ do)]
     [hash (#+ Hash)]
     [\\specification
      ["$." hash]]]
    [control
     ["." maybe]]
    [data
     ["." text]
     [collection
      ["." set (#+ Set)]
      ["." list ("#\." functor fold)]]]
    [macro
     ["." template]]
    [math
     ["." random (#+ Random)]
     [number
      ["n" nat]]]]]
  [\\library
   ["." /]])

(type: Bundle
  {#amount Nat
   #names (Set Text)
   #codes (Set Text)
   #languages (Set /.Language)
   #test Test})

(template [<bundle> <languages>]
  [(def: <bundle>
     Bundle
     (let [amount (template.amount <languages>)
           languages (: (List /.Language)
                        (`` (list (~~ (template.spliced <languages>)))))]
       {#amount amount
        #names (|> languages (list\map /.name) (set.of_list text.hash))
        #codes (|> languages (list\map /.code) (set.of_list text.hash))
        #languages (set.of_list /.hash languages)
        #test (_.cover <languages>
                       true)}))]

  [languages/a [/.afar /.abkhazian /.achinese /.acoli /.adangme
                /.adyghe /.afro_asiatic /.afrihili /.afrikaans /.ainu
                /.akan /.akkadian /.aleut /.algonquian /.southern_altai
                /.amharic /.old_english /.angika /.apache /.arabic
                /.official_aramaic /.aragonese /.mapudungun /.arapaho /.artificial
                /.arawak /.assamese /.asturian /.athapascan /.australian
                /.avaric /.avestan /.awadhi /.aymara /.azerbaijani]]
  [languages/b [/.banda /.bamileke /.bashkir /.baluchi /.bambara
                /.balinese /.basa /.baltic /.beja /.belarusian
                /.bemba /.bengali /.berber /.bhojpuri /.bihari
                /.bikol /.bini /.bislama /.siksika /.bantu
                /.tibetan /.bosnian /.braj /.breton /.batak
                /.buriat /.buginese /.bulgarian /.blin]]
  [languages/c [/.caddo /.central_american_indian /.galibi_carib /.catalan /.caucasian
                /.cebuano /.celtic /.czech /.chamorro /.chibcha
                /.chechen /.chagatai /.chuukese /.mari /.chinook
                /.choctaw /.chipewyan /.cherokee /.church_slavic /.chuvash
                /.cheyenne /.chamic /.montenegrin /.coptic /.cornish
                /.corsican /.creoles_and_pidgins/english /.creoles_and_pidgins/french /.creoles_and_pidgins/portuguese /.cree
                /.crimean /.creoles_and_pidgins /.kashubian /.cushitic /.welsh]]
  [languages/d [/.dakota /.danish /.dargwa /.land_dayak /.delaware
                /.slavey /.dogrib /.dinka /.dhivehi /.dogri
                /.dravidian /.lower_sorbian /.duala /.middle_dutch /.dyula
                /.dzongkha]]
  [languages/e [/.efik /.egyptian /.ekajuk /.greek /.elamite
                /.english /.middle_english /.esperanto /.estonian /.basque
                /.ewe /.ewondo]]
  [languages/f [/.fang /.faroese /.persian /.fanti /.fijian
                /.filipino /.finnish /.finno_ugrian /.fon /.french
                /.middle_french /.old_french /.northern_frisian /.eastern_frisian /.western_frisian
                /.fulah /.friulian]]
  [languages/g [/.ga /.gayo /.gbaya /.germanic /.german
                /.geez /.gilbertese /.gaelic /.irish /.galician
                /.manx /.middle_high_german /.old_high_german /.gondi /.gorontalo
                /.gothic /.grebo /.ancient_greek /.guarani /.swiss_german
                /.gujarati /.gwich'in]]
  [languages/h [/.haida /.haitian /.hausa /.hawaiian /.hebrew
                /.herero /.hiligaynon /.himachali /.hindi /.hittite
                /.hmong /.hiri_motu /.croatian /.upper_sorbian /.hungarian
                /.hupa /.armenian]]
  [languages/i [/.iban /.igbo /.ido /.sichuan_yi /.ijo
                /.inuktitut /.interlingue /.iloko /.interlingua /.indic
                /.indonesian /.indo_european /.ingush /.inupiaq /.iranian
                /.iroquoian /.icelandic /.italian]]
  [languages/j [/.javanese /.lojban /.japanese /.judeo_persian /.judeo_arabic]]
  [languages/k [/.kara_kalpak /.kabyle /.kachin /.kalaallisut /.kamba
                /.kannada /.karen /.kashmiri /.georgian /.kanuri
                /.kawi /.kazakh /.kabardian /.khasi /.khoisan
                /.central_khmer /.khotanese /.gikuyu /.kinyarwanda /.kyrgyz
                /.kimbundu /.konkani /.komi /.kongo /.korean
                /.kosraean /.kpelle /.karachay_balkar /.karelian /.kru
                /.kurukh /.kwanyama /.kumyk /.kurdish /.kutenai]]
  [languages/l [/.ladino /.lahnda /.lamba /.lao /.latin
                /.latvian /.lezghian /.limburgan /.lingala /.lithuanian
                /.mongo /.lozi /.luxembourgish /.luba_lulua /.luba_katanga
                /.ganda /.luiseno /.lunda /.luo /.lushai]]
  [languages/m [/.madurese /.magahi /.marshallese /.maithili /.makasar
                /.malayalam /.mandingo /.austronesian /.marathi /.masai
                /.moksha /.mandar /.mende /.middle_irish /.mi'kmaq
                /.minangkabau /.macedonian /.mon_khmer /.malagasy /.maltese
                /.manchu /.manipuri /.manobo /.mohawk /.mongolian
                /.mossi /.maori /.malay /.munda /.creek
                /.mirandese /.marwari /.burmese /.mayan /.erzya]]
  [languages/n [/.nahuatl /.north_american_indian /.neapolitan /.nauru /.navajo
                /.south_ndebele /.north_ndebele /.ndonga /.low_german /.nepali
                /.newari /.nias /.niger_kordofanian /.niuean /.dutch
                /.nynorsk /.bokmal /.nogai /.old_norse /.norwegian
                /.n'ko /.northern_sotho /.nubian /.old_newari /.nyanja
                /.nyamwezi /.nyankole /.nyoro /.nzima]]
  [languages/o [/.occitan /.ojibwa /.oriya /.oromo /.osage
                /.ossetic /.ottoman_turkish /.otomian]]
  [languages/p [/.papuan /.pangasinan /.pahlavi /.pampanga /.punjabi
                /.papiamento /.palauan /.old_persian /.philippine /.phoenician
                /.pali /.polish /.pohnpeian /.portuguese /.prakrit
                /.old_provencal /.pashto]]
  [languages/q [/.quechua]]
  [languages/r [/.rajasthani /.rapanui /.rarotongan /.romance /.romansh
                /.romany /.romanian /.rundi /.aromanian /.russian]]
  [languages/s0 [/.sandawe /.sango /.yakut /.south_american_indian /.salishan
                 /.samaritan_aramaic /.sanskrit /.sasak /.santali /.sicilian
                 /.scots /.selkup /.semitic /.old_irish /.sign
                 /.shan /.sidamo /.sinhalese /.siouan /.sino_tibetan
                 /.slavic /.slovak /.slovenian /.southern_sami /.northern_sami
                 /.sami /.lule /.inari /.samoan /.skolt_sami]]
  [languages/s1 [/.shona /.sindhi /.soninke /.sogdian /.somali
                 /.songhai /.southern_sotho /.spanish /.albanian /.sardinian
                 /.sranan_tongo /.serbian /.serer /.nilo_saharan /.swati
                 /.sukuma /.sundanese /.susu /.sumerian /.swahili
                 /.swedish /.classical_syriac /.syriac]]
  [languages/t [/.tahitian /.tai /.tamil /.tatar /.telugu
                /.timne /.tereno /.tetum /.tajik /.tagalog
                /.thai /.tigre /.tigrinya /.tiv /.tokelau
                /.klingon /.tlingit /.tamashek /.tonga /.tongan
                /.tok_pisin /.tsimshian /.tswana /.tsonga /.turkmen
                /.tumbuka /.tupi /.turkish /.altaic /.tuvalu
                /.twi /.tuvinian]]
  [languages/u [/.udmurt /.ugaritic /.uyghur /.ukrainian /.umbundu
                /.urdu /.uzbek]]
  [languages/v [/.vai /.venda /.vietnamese /.volapük /.votic]]
  [languages/w [/.wakashan /.walamo /.waray /.washo /.sorbian
                /.walloon /.wolof]]
  [languages/x [/.kalmyk /.xhosa]]
  [languages/y [/.yao /.yapese /.yiddish /.yoruba /.yupik]]
  [languages/z [/.zapotec /.blissymbols /.zenaga /.standard_moroccan_tamazight /.zhuang
                /.chinese /.zande /.zulu /.zuni /.zaza]]
  [languages/etc [/.uncoded /.multiple /.undetermined /.not_applicable]]
  )

(def: languages
  (List Bundle)
  (list ..languages/a
        ..languages/b
        ..languages/c
        ..languages/d
        ..languages/e
        ..languages/f
        ..languages/g
        ..languages/h
        ..languages/i
        ..languages/j
        ..languages/k
        ..languages/l
        ..languages/m
        ..languages/n
        ..languages/o
        ..languages/p
        ..languages/q
        ..languages/r
        ..languages/s0
        ..languages/s1
        ..languages/t
        ..languages/u
        ..languages/v
        ..languages/w
        ..languages/x
        ..languages/y
        ..languages/z
        ..languages/etc
        ))

(def: (aggregate lens hash territories)
  (All [a] (-> (-> Bundle (Set a))
               (Hash a)
               (List Bundle)
               [Nat (Set a)]))
  (list\fold (function (_ bundle [amount set])
               [(n.+ amount (value@ #amount bundle))
                (set.union set (lens bundle))])
             [0 (set.empty hash)]
             territories))

(def: languages_test
  Test
  (|> ..languages
      list.reversed
      (list\map (value@ #test))
      (list\fold _.and
                 (`` ($_ _.and
                         (~~ (template [<lens> <tag> <hash>]
                               [(let [[amount set] (..aggregate (value@ <tag>) <hash> ..languages)]
                                  (_.cover [<lens>]
                                           (n.= amount (set.size set))))]

                               [/.name #names text.hash]
                               [/.code #codes text.hash]
                               [/.equivalence #languages /.hash]
                               ))
                         )))))

(template: (!aliases <reference> <aliases>)
  [(_.cover <aliases>
            (list.every? (\ /.equivalence = <reference>)
                         (`` (list (~~ (template.spliced <aliases>))))))])

(def: aliases_test/0
  Test
  ($_ _.and
      ... A
      (!aliases /.official_aramaic [/.imperial_aramaic])
      (!aliases /.asturian [/.bable /.leonese /.asturleonese])
      ... B
      (!aliases /.bini [/.edo])
      (!aliases /.blin [/.bilin])
      ... C
      (!aliases /.catalan [/.valencian])
      (!aliases /.church_slavic [/.old_slavonic /.church_slavonic /.old_bulgarian /.old_church_slavonic])
      ... D
      (!aliases /.dhivehi [/.maldivian])
      ... G
      (!aliases /.swiss_german [/.alemannic /.alsatian])
      ... I
      (!aliases /.sichuan_yi [/.nuosu])
      ... K
      (!aliases /.kachin [/.jingpho])
      (!aliases /.kalaallisut [/.greenlandic])
      (!aliases /.khotanese [/.sakan])
      ))

(def: aliases_test/1
  Test
  ($_ _.and
      ... M
      (!aliases /.mi'kmaq [/.micmac])
      ... N
      (!aliases /.newari [/.nepal_bhasa])
      (!aliases /.dutch [/.flemish])
      (!aliases /.northern_sotho [/.pedi /.sepedi])
      (!aliases /.old_newari [/.classical_newari /.classical_nepal_bhasa])
      (!aliases /.nyanja [/.chichewa /.chewa])
      ... O
      (!aliases /.occitan [/.provencal])
      ... P
      (!aliases /.pampanga [/.kapampangan])
      ... R
      (!aliases /.rarotongan [/.cook_islands_maori])
      (!aliases /.romanian [/.moldavian /.moldovan])
      (!aliases /.aromanian [/.arumanian /.macedo_romanian])
      ... S
      (!aliases /.spanish [/.castilian])
      ... X
      (!aliases /.kalmyk [/.oirat])
      ... Z
      (!aliases /.zaza [/.dimili /.dimli /.kirdki /.kirmanjki /.zazaki])
      ))

(def: aliases_test
  Test
  ($_ _.and
      ..aliases_test/0
      ..aliases_test/1
      ))

(def: .public random
  (Random /.Language)
  (let [options (|> ..languages
                    (list\map (|>> (value@ #languages) set.list))
                    list.together)]
    (do {! random.monad}
      [choice (\ ! map (n.% (list.size options))
                 random.nat)]
      (in (maybe.trusted (list.item choice options))))))

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Language])
      ($_ _.and
          (_.for [/.hash]
                 ($hash.spec /.hash ..random))
          
          ..languages_test
          ..aliases_test
          )))