(.module: [library [lux #* [abstract [equivalence (#+ Equivalence)] ["." hash (#+ Hash)]] [control ["." maybe ("#\." functor)]] [data ["." text ["%" format (#+ format)] ["." encoding (#+ Encoding)]]] [type abstract]]] [/ ["." language (#+ Language)] ["." territory (#+ Territory)]]) (abstract: .public Locale {#.doc (example "A description of a locale; with territory, (optional) language, and (optional) text-encoding.")} Text (def: territory_separator "_") (def: encoding_separator ".") (def: .public (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.else "")) (|> encoding (maybe\map (|>> encoding.name (format ..encoding_separator))) (maybe.else ""))))) (def: .public code (-> Locale Text) (|>> :representation)) (def: .public hash (Hash Locale) (\ hash.functor map ..code text.hash)) (def: .public equivalence (Equivalence Locale) (\ ..hash &equivalence)) )