diff options
author | Eduardo Julian | 2019-02-12 18:56:18 -0400 |
---|---|---|
committer | Eduardo Julian | 2019-02-12 18:56:18 -0400 |
commit | 845ccb5460583df6cbf37824c2eed82729a24804 (patch) | |
tree | 52dc2b64b8d6f08fd3e4717e9fb3c31aa2704833 /stdlib/source/lux/tool/compiler/meta/archive | |
parent | 733e35d9e17d1fc0bdb642e7b56ebd7ac34d4b67 (diff) |
Re-named "lux/platform" to "lux/tool".
Diffstat (limited to 'stdlib/source/lux/tool/compiler/meta/archive')
4 files changed, 108 insertions, 0 deletions
diff --git a/stdlib/source/lux/tool/compiler/meta/archive/descriptor.lux b/stdlib/source/lux/tool/compiler/meta/archive/descriptor.lux new file mode 100644 index 000000000..328240e6c --- /dev/null +++ b/stdlib/source/lux/tool/compiler/meta/archive/descriptor.lux @@ -0,0 +1,16 @@ +(.module: + [lux (#- Module) + [data + [collection + [set (#+ Set)]]] + [world + [file (#+ File)]]]) + +(type: #export Module Text) + +(type: #export Descriptor + {#hash Nat + #name Module + #file File + #references (Set Module) + #state Module-State}) diff --git a/stdlib/source/lux/tool/compiler/meta/archive/document.lux b/stdlib/source/lux/tool/compiler/meta/archive/document.lux new file mode 100644 index 000000000..5c077080f --- /dev/null +++ b/stdlib/source/lux/tool/compiler/meta/archive/document.lux @@ -0,0 +1,49 @@ +(.module: + [lux (#- Module) + [control + ["ex" exception (#+ exception:)]] + [data + ["." error (#+ Error)] + [collection + ["." dictionary (#+ Dictionary)]]] + [type (#+ :share) + abstract]] + [// + ["." signature (#+ Signature)] + ["." key (#+ Key)] + [descriptor (#+ Module)]]) + +## Document +(exception: #export (invalid-signature {expected Signature} {actual Signature}) + (ex.report ["Expected" (signature.description expected)] + ["Actual" (signature.description actual)])) + +(abstract: #export (Document d) + {} + + {#signature Signature + #content d} + + (def: #export (read key document) + (All [d] (-> (Key d) (Document Any) (Error d))) + (let [[document//signature document//content] (:representation document)] + (if (:: signature.equivalence = + (key.signature key) + document//signature) + (#error.Success (:share [e] + {(Key e) + key} + {e + document//content})) + (ex.throw invalid-signature [(key.signature key) + document//signature])))) + + (def: #export (write key content) + (All [d] (-> (Key d) d (Document d))) + (:abstraction {#signature (key.signature key) + #content content})) + + (def: #export signature + (-> (Document Any) Signature) + (|>> :representation (get@ #signature))) + ) diff --git a/stdlib/source/lux/tool/compiler/meta/archive/key.lux b/stdlib/source/lux/tool/compiler/meta/archive/key.lux new file mode 100644 index 000000000..50c10ac01 --- /dev/null +++ b/stdlib/source/lux/tool/compiler/meta/archive/key.lux @@ -0,0 +1,20 @@ +(.module: + [lux #* + [type + abstract]] + [// + [signature (#+ Signature)]]) + +(abstract: #export (Key k) + {} + + Signature + + (def: #export signature + (-> (Key Any) Signature) + (|>> :representation)) + + (def: #export (key signature sample) + (All [d] (-> Signature d (Key d))) + (:abstraction signature)) + ) diff --git a/stdlib/source/lux/tool/compiler/meta/archive/signature.lux b/stdlib/source/lux/tool/compiler/meta/archive/signature.lux new file mode 100644 index 000000000..fb96aec58 --- /dev/null +++ b/stdlib/source/lux/tool/compiler/meta/archive/signature.lux @@ -0,0 +1,23 @@ +(.module: + [lux #* + [control + ["." equivalence (#+ Equivalence)]] + [data + ["." name] + ["." text + format]]] + [//// + [default (#+ Version)]]) + +## Key +(type: #export Signature + {#name Name + #version Version}) + +(def: #export equivalence + (Equivalence Signature) + (equivalence.product name.equivalence text.equivalence)) + +(def: #export (description signature) + (-> Signature Text) + (format (%name (get@ #name signature)) " " (get@ #version signature))) |