(.using [library [lux "*" [abstract [equivalence {"+" Equivalence}] ["[0]" hash {"+" Hash}]] [control ["[0]" maybe ("[1]#[0]" functor)]] [data ["[0]" text ["%" format {"+" format}] ["[0]" encoding {"+" Encoding}]]] [type abstract]]] [/ ["[0]" language {"+" Language}] ["[0]" territory {"+" Territory}]]) (abstract: .public Locale 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#each (|>> territory.long_code (format ..territory_separator))) (maybe.else "")) (|> encoding (maybe#each (|>> encoding.name (format ..encoding_separator))) (maybe.else ""))))) (def: .public code (-> Locale Text) (|>> :representation)) (def: .public hash (Hash Locale) (# hash.functor each ..code text.hash)) (def: .public equivalence (Equivalence Locale) (# ..hash &equivalence)) )