(.module: [lux #* [abstract [equivalence (#+ Equivalence)] ["." hash (#+ Hash)]] [data ["." maybe ("#\." functor)] ["." text ["%" format (#+ format)] ["." encoding (#+ Encoding)]]] [type abstract]] [/ ["." 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.code language) (|> territory (maybe\map (|>> territory.long_code (format ..territory_separator))) (maybe.default "")) (|> encoding (maybe\map (|>> encoding.name (format ..encoding_separator))) (maybe.default ""))))) (def: #export code (-> Locale Text) (|>> :representation)) (def: #export hash (Hash Locale) (\ hash.functor map ..code text.hash)) (def: #export equivalence (Equivalence Locale) (\ ..hash &equivalence)) )