summaryrefslogtreecommitdiff
path: root/node_modules/get-source/impl/SyncPromise.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/get-source/impl/SyncPromise.js')
-rw-r--r--node_modules/get-source/impl/SyncPromise.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/node_modules/get-source/impl/SyncPromise.js b/node_modules/get-source/impl/SyncPromise.js
new file mode 100644
index 0000000..1412532
--- /dev/null
+++ b/node_modules/get-source/impl/SyncPromise.js
@@ -0,0 +1,51 @@
+"use strict";
+
+/* ------------------------------------------------------------------------ */
+
+module.exports = class SyncPromise {
+
+ constructor (fn) {
+ try {
+ fn (
+ x => { this.setValue (x, false) }, // resolve
+ x => { this.setValue (x, true) } // reject
+ )
+ } catch (e) {
+ this.setValue (e, true)
+ }
+ }
+
+ setValue (x, rejected) {
+ this.val = (x instanceof SyncPromise) ? x.val : x
+ this.rejected = rejected || ((x instanceof SyncPromise) ? x.rejected : false)
+ }
+
+ static valueFrom (x) {
+ if (x instanceof SyncPromise) {
+ if (x.rejected) throw x.val
+ else return x.val
+ } else {
+ return x
+ }
+ }
+
+ then (fn) {
+ try { if (!this.rejected) return SyncPromise.resolve (fn (this.val)) }
+ catch (e) { return SyncPromise.reject (e) }
+ return this
+ }
+
+ catch (fn) {
+ try { if (this.rejected) return SyncPromise.resolve (fn (this.val)) }
+ catch (e) { return SyncPromise.reject (e) }
+ return this
+ }
+
+ static resolve (x) {
+ return new SyncPromise (resolve => { resolve (x) })
+ }
+
+ static reject (x) {
+ return new SyncPromise ((_, reject) => { reject (x) })
+ }
+} \ No newline at end of file