--- /dev/null
+var Individual = require('individual')
+
+var VERSION_KEY = '1';
+var ERROR_CACHE_KEY = '__RUST_RESULT_ERROR_UUID@' + VERSION_KEY
+var OK_CACHE_KEY = '__RUST_RESULT_OK_UUID@' + VERSION_KEY
+
+var ERROR_UUID = Individual(ERROR_CACHE_KEY, fakeUUID('Error'))
+var OK_UUID = Individual(OK_CACHE_KEY, fakeUUID('Ok'))
+
+function Ok(v) {
+ this.v = v
+
+ this[OK_UUID] = true
+}
+
+function Err(err) {
+ this.err = err
+
+ this[ERROR_UUID] = true
+}
+
+function createOk(v) {
+ if (isObject(v) && OK_UUID in v) {
+ return v.v
+ } else if (isObject(v) && ERROR_UUID in v) {
+ return undefined
+ } else {
+ if (v === undefined) {
+ throw Error('rust-result: Cannot box `undefined` in Result.Ok')
+ }
+
+ return new Ok(v)
+ }
+}
+
+function createErr(err) {
+ if (isObject(err) && ERROR_UUID in err) {
+ return err.err
+ } else if (isObject(err) && OK_UUID in err) {
+ return undefined
+ } else {
+ if (!isError(err)) {
+ throw Error('rust-result: Cannot box a non-error in Result.Err')
+ }
+
+ return new Err(err)
+ }
+}
+
+function isOk(v) {
+ return createOk(v) !== undefined
+}
+
+function isErr(err) {
+ return createErr(err) !== undefined
+}
+
+module.exports = {
+ isOk: isOk,
+ Ok: createOk,
+ isErr: isErr,
+ Err: createErr
+}
+
+function fakeUUID(word) {
+ return 'rust-result:' + word + ':' +
+ Math.random().toString(32).slice(2) + ':' +
+ Math.random().toString(32).slice(2) + ':' +
+ Math.random().toString(32).slice(2) + ':' +
+ Math.random().toString(32).slice(2) + ':'
+}
+
+function isObject(o) {
+ return typeof o === 'object' && o !== null
+}
+
+function isError(e) {
+ return isObject(e) &&
+ (Object.prototype.toString.call(e) === '[object Error]' ||
+ /* istanbul ignore next */ e instanceof Error)
+}