aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/tool/compiler/meta/archive
diff options
context:
space:
mode:
authorEduardo Julian2019-02-12 18:56:18 -0400
committerEduardo Julian2019-02-12 18:56:18 -0400
commit845ccb5460583df6cbf37824c2eed82729a24804 (patch)
tree52dc2b64b8d6f08fd3e4717e9fb3c31aa2704833 /stdlib/source/lux/tool/compiler/meta/archive
parent733e35d9e17d1fc0bdb642e7b56ebd7ac34d4b67 (diff)
Re-named "lux/platform" to "lux/tool".
Diffstat (limited to 'stdlib/source/lux/tool/compiler/meta/archive')
-rw-r--r--stdlib/source/lux/tool/compiler/meta/archive/descriptor.lux16
-rw-r--r--stdlib/source/lux/tool/compiler/meta/archive/document.lux49
-rw-r--r--stdlib/source/lux/tool/compiler/meta/archive/key.lux20
-rw-r--r--stdlib/source/lux/tool/compiler/meta/archive/signature.lux23
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)))