(.using [library [lux "*" [abstract [equivalence {"+" Equivalence}] [hash {"+" Hash}]] [data ["[0]" product] [text ["%" format]] [collection ["[0]" set {"+" Set}]]] [math [number ["[0]" nat]]]]] [// ["[0]" module] ["[0]" artifact]]) (type: .public ID (Record [#module module.ID #artifact artifact.ID])) (def: .public hash (Hash ID) (all product.hash nat.hash nat.hash)) (def: .public equivalence (Equivalence ID) (# ..hash equivalence)) (def: .public none (Set ID) (set.empty ..hash)) (def: .public (format it) (%.Format ID) (%.format (%.nat (the #module it)) "." (%.nat (the #artifact it))))