(.module: [library [lux (#- Name) [abstract [equivalence (#+ Equivalence)] [order (#+ Order)] [hash (#+ Hash)]] [data ["." product] ["." text ("#\." order) ["%" format (#+ Format)]] [collection ["." list ("#\." monoid)]]] [world ["." file (#+ Path)] [net ["." uri (#+ URI)]]]]]) (type: #export Group Text) (type: #export Name Text) (type: #export Version Text) (type: #export Artifact {#group Group #name Name #version Version}) (def: #export hash (Hash Artifact) ($_ product.hash text.hash text.hash text.hash )) (def: #export equivalence (Equivalence Artifact) (\ ..hash &equivalence)) (implementation: #export order (Order Artifact) (def: &equivalence ..equivalence) (def: (< reference subject) (<| (or (text\< (get@ #group reference) (get@ #group subject))) (and (text\= (get@ #group reference) (get@ #group subject))) (or (text\< (get@ #name reference) (get@ #name subject))) (and (text\= (get@ #name reference) (get@ #name subject))) (text\< (get@ #version reference) (get@ #version subject))))) (template [ ] [(def: Text )] ["." group_separator] ["-" version_separator] [":" identity_separator] ) (def: #export (identity artifact) (-> Artifact Text) (%.format (get@ #name artifact) ..version_separator (get@ #version artifact))) (def: #export (format value) (Format Artifact) (%.format (get@ #group value) ..identity_separator (..identity value))) (def: #export (directory separator group) (-> Text Group Text) (|> group (text.split_all_with ..group_separator) (text.join_with separator))) (def: #export (uri version artifact) (-> Version Artifact URI) (let [/ uri.separator group (..directory / (get@ #group artifact)) name (get@ #name artifact) ## version (get@ #version artifact) identity (..identity artifact)] (%.format group / name / version / identity))) (def: #export (local artifact) (-> Artifact (List Text)) (list\compose (|> artifact (get@ #group) (text.split_all_with ..group_separator)) (list (get@ #name artifact) (get@ #version artifact))))