(.module: [lux #* [abstract [equivalence (#+ Equivalence)] [hash (#+ Hash)]] [data ["." text ["%" format (#+ format)] ["." encoding (#+ Encoding)]]] [type abstract] ["." macro]] [/ ["." language (#+ Language)] ["." territory (#+ Territory)]]) (abstract: #export Locale {} Text (def: territory-separator "_") (def: encoding-separator ".") (def: #export (locale language territory encoding) (-> Language (Maybe Territory) (Maybe Encoding) Locale) (:abstraction (format (language.language language) (case territory (#.Some territory) (format ..territory-separator (territory.long-code territory)) #.None "") (case encoding (#.Some encoding) (format ..encoding-separator (encoding.name encoding)) #.None "")))) (def: #export code (-> Locale Text) (|>> :representation)) (structure: #export equivalence (Equivalence Locale) (def: (= reference sample) (:: text.equivalence = (:representation reference) (:representation sample)))) (structure: #export hash (Hash Locale) (def: &equivalence ..equivalence) (def: hash (|>> :representation (:: text.hash hash)))) )