(.using [library [lux (.full) ["_" test (.only Test)] [abstract [monad (.only do)] [hash (.only Hash)] [\\specification ["$[0]" hash]]] [control ["[0]" maybe]] [data ["[0]" text] [collection ["[0]" set (.only Set)] ["[0]" list ("[1]#[0]" functor mix)]]] [macro ["[0]" template]] [math ["[0]" random (.only Random)] [number ["n" nat]]]]] [\\library ["[0]" /]]) (type: Bundle (Record [#amount Nat #names (Set Text) #shorts (Set Text) #longs (Set Text) #numbers (Set Nat) #territories (Set /.Territory) #test Test])) (template [ ] [(def: Bundle (let [amount (template.amount ) territories (`` (list (~~ (template.spliced ))))] [#amount amount #names (|> territories (list#each /.name) (set.of_list text.hash)) #shorts (|> territories (list#each /.short_code) (set.of_list text.hash)) #longs (|> territories (list#each /.long_code) (set.of_list text.hash)) #numbers (|> territories (list#each /.numeric_code) (set.of_list n.hash)) #territories (|> territories (set.of_list /.hash)) #test (_.coverage true)]))] [territories/a [/.afghanistan /.aland_islands /.albania /.algeria /.american_samoa /.andorra /.angola /.anguilla /.antarctica /.antigua /.argentina /.armenia /.aruba /.australia /.austria /.azerbaijan]] [territories/b [/.the_bahamas /.bahrain /.bangladesh /.barbados /.belarus /.belgium /.belize /.benin /.bermuda /.bhutan /.bolivia /.bonaire /.bosnia /.botswana /.bouvet_island /.brazil /.british_indian_ocean_territory /.brunei_darussalam /.bulgaria /.burkina_faso /.burundi]] [territories/c [/.cape_verde /.cambodia /.cameroon /.canada /.cayman_islands /.central_african_republic /.chad /.chile /.china /.christmas_island /.cocos_islands /.colombia /.comoros /.congo /.democratic_republic_of_the_congo /.cook_islands /.costa_rica /.ivory_coast /.croatia /.cuba /.curacao /.cyprus /.czech_republic]] [territories/d [/.denmark /.djibouti /.dominica /.dominican_republic]] [territories/e [/.ecuador /.egypt /.el_salvador /.equatorial_guinea /.eritrea /.estonia /.eswatini /.ethiopia]] [territories/f [/.falkland_islands /.faroe_islands /.fiji /.finland /.france /.french_guiana /.french_polynesia /.french_southern_territories]] [territories/g [/.gabon /.the_gambia /.georgia /.germany /.ghana /.gibraltar /.greece /.greenland /.grenada /.guadeloupe /.guam /.guatemala /.guernsey /.guinea /.guinea_bissau /.guyana]] [territories/h [/.haiti /.heard_island /.honduras /.hong_kong /.hungary]] [territories/i [/.iceland /.india /.indonesia /.iran /.iraq /.ireland /.isle_of_man /.israel /.italy]] [territories/j [/.jamaica /.japan /.jersey /.jordan]] [territories/k [/.kazakhstan /.kenya /.kiribati /.north_korea /.south_korea /.kuwait /.kyrgyzstan]] [territories/l [/.laos /.latvia /.lebanon /.lesotho /.liberia /.libya /.liechtenstein /.lithuania /.luxembourg]] [territories/m [/.macau /.macedonia /.madagascar /.malawi /.malaysia /.maldives /.mali /.malta /.marshall_islands /.martinique /.mauritania /.mauritius /.mayotte /.mexico /.micronesia /.moldova /.monaco /.mongolia /.montenegro /.montserrat /.morocco /.mozambique /.myanmar]] [territories/n [/.namibia /.nauru /.nepal /.netherlands /.new_caledonia /.new_zealand /.nicaragua /.niger /.nigeria /.niue /.norfolk_island /.northern_mariana_islands /.norway]] [territories/o [/.oman]] [territories/p [/.pakistan /.palau /.palestine /.panama /.papua_new_guinea /.paraguay /.peru /.philippines /.pitcairn_islands /.poland /.portugal /.puerto_rico]] [territories/q [/.qatar]] [territories/r [/.reunion /.romania /.russia /.rwanda]] [territories/s [/.saint_barthelemy /.saint_helena /.saint_kitts /.saint_lucia /.saint_martin /.saint_pierre /.saint_vincent /.samoa /.san_marino /.sao_tome /.saudi_arabia /.senegal /.serbia /.seychelles /.sierra_leone /.singapore /.sint_maarten /.slovakia /.slovenia /.solomon_islands /.somalia /.south_africa /.south_georgia /.south_sudan /.spain /.sri_lanka /.sudan /.suriname /.svalbard /.sweden /.switzerland /.syria]] [territories/t [/.taiwan /.tajikistan /.tanzania /.thailand /.east_timor /.togo /.tokelau /.tonga /.trinidad /.tunisia /.turkey /.turkmenistan /.turks /.tuvalu]] [territories/u [/.uganda /.ukraine /.united_arab_emirates /.united_kingdom /.united_states_of_america /.united_states_minor_outlying_islands /.uruguay /.uzbekistan]] [territories/v [/.vanuatu /.vatican_city /.venezuela /.vietnam /.british_virgin_islands /.united_states_virgin_islands]] [territories/w [/.wallis /.western_sahara]] [territories/y [/.yemen]] [territories/z [/.zambia /.zimbabwe]] ) (def: territories (List Bundle) (list ..territories/a ..territories/b ..territories/c ..territories/d ..territories/e ..territories/f ..territories/g ..territories/h ..territories/i ..territories/j ..territories/k ..territories/l ..territories/m ..territories/n ..territories/o ..territories/p ..territories/q ..territories/r ..territories/s ..territories/t ..territories/u ..territories/v ..territories/w ..territories/y ..territories/z)) (def: (aggregate lens hash territories) (All (_ a) (-> (-> Bundle (Set a)) (Hash a) (List Bundle) [Nat (Set a)])) (list#mix (function (_ bundle [amount set]) [(n.+ amount (the #amount bundle)) (set.union set (lens bundle))]) [0 (set.empty hash)] territories)) (def: territories_test Test (|> ..territories list.reversed (list#each (the #test)) (list#mix _.and (`` (all _.and (~~ (template [ ] [(let [[amount set] (..aggregate (the ) ..territories)] (_.coverage [] (n.= amount (set.size set))))] [/.name #names text.hash] [/.short_code #shorts text.hash] [/.long_code #longs text.hash] [/.numeric_code #numbers n.hash] [/.equivalence #territories /.hash] )) ))))) (template: (!aliases ) [(_.coverage (list.every? (# /.equivalence = ) (`` (list (~~ (template.spliced ))))))]) (def: aliases_test Test (all _.and ... A (!aliases /.antigua [/.barbuda]) ... B (!aliases /.bonaire [/.sint_eustatius /.saba]) (!aliases /.bosnia [/.herzegovina]) ... H (!aliases /.heard_island [/.mcdonald_islands]) ... S (!aliases /.saint_helena [/.ascension /.tristan_da_cunha]) (!aliases /.saint_kitts [/.nevis]) (!aliases /.saint_pierre [/.miquelon]) (!aliases /.saint_vincent [/.the_grenadines]) (!aliases /.sao_tome [/.principe]) (!aliases /.south_georgia [/.south_sandwich_islands]) (!aliases /.svalbard [/.jan_mayen]) ... T (!aliases /.trinidad [/.tobago]) (!aliases /.turks [/.caicos_islands]) ... U (!aliases /.united_kingdom [/.northern_ireland]) ... W (!aliases /.wallis [/.futuna]) )) (def: .public random (Random /.Territory) (let [options (|> ..territories (list#each (|>> (the #territories) set.list)) list.together)] (do [! random.monad] [choice (# ! each (n.% (list.size options)) random.nat)] (in (maybe.trusted (list.item choice options)))))) (def: .public test Test (<| (_.covering /._) (_.for [/.Territory]) (all _.and (_.for [/.hash] ($hash.spec /.hash ..random)) ..territories_test ..aliases_test )))