perlica
Version:
> [!WARNING] > 🚧 Work in progress!
314 lines (309 loc) • 7.01 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/Option.ts
var Option_exports = {};
__export(Option_exports, {
OptionProto: () => OptionProto,
bind: () => bind,
fromNullable: () => fromNullable,
fromResult: () => fromResult,
isNone: () => isNone,
isSome: () => isSome,
none: () => none,
some: () => some,
tryCatch: () => tryCatch,
tryPromise: () => tryPromise
});
module.exports = __toCommonJS(Option_exports);
// src/Iterator.ts
var OnceIterator = class _OnceIterator {
constructor(value) {
this.value = value;
}
done = false;
next(value) {
if (this.done) {
return {
done: true,
value
};
}
this.done = true;
return {
done: false,
value: this.value
};
}
[Symbol.iterator]() {
return new _OnceIterator(this.value);
}
};
// src/Result.ts
var isOk = (r) => r.tag === "ok";
var isErr = (r) => r.tag === "err";
var ResultProto = () => ({
and(f) {
return isOk(this) ? ok(f(this.value)) : err(this.value);
},
andThen(f) {
return isOk(this) ? f(this.value) : err(this.value);
},
err() {
return isErr(this) ? some(this.value) : none();
},
expect(msg) {
if (isOk(this)) {
return this.value;
} else {
throw new Error(msg);
}
},
expectErr(msg) {
if (isErr(this)) {
return this.value;
} else {
throw new Error(msg);
}
},
flatten() {
return this.andThen((v) => v);
},
inspect(f) {
if (isOk(this)) {
f(this.value);
return ok(this.value);
} else {
return err(this.value);
}
},
inspectErr(f) {
if (isErr(this)) {
f(this.value);
return err(this.value);
} else {
return ok(this.value);
}
},
isErr() {
return isErr(this);
},
isErrAnd(f) {
return isErr(this) && f(this.value);
},
isOk() {
return isOk(this);
},
isOkAnd(f) {
return isOk(this) && f(this.value);
},
map(f) {
return isOk(this) ? ok(f(this.value)) : err(this.value);
},
mapErr(f) {
return isErr(this) ? err(f(this.value)) : ok(this.value);
},
mapOr(def, f) {
return isOk(this) ? f(this.value) : def;
},
mapOrElse(def, f) {
return isOk(this) ? f(this.value) : def(this.value);
},
ok() {
return isOk(this) ? some(this.value) : none();
},
or(f) {
return isErr(this) ? err(f(this.value)) : ok(this.value);
},
orElse(f) {
return isErr(this) ? f(this.value) : ok(this.value);
},
transpose() {
return isErr(this) ? some(err(this.value)) : isNone(this.value) ? none() : some(ok(this.value.value));
},
unwrap() {
if (isOk(this)) {
return this.value;
} else {
throw new Error(`called \`Result.unwrap()\` on an \`Err\` value: ${String(this.value)}`);
}
},
unwrapErr() {
if (isErr(this)) {
return this.value;
} else {
throw new Error(`called \`Result.unwrap()\` on an \`Ok\` value: ${String(this.value)}`);
}
},
unwrapOr(def) {
return isOk(this) ? this.value : def;
},
unwrapOrElse(def) {
return isOk(this) ? this.value : def(this.value);
},
[Symbol.iterator]() {
return new OnceIterator(this);
}
});
var ok = (v) => {
const a = Object.create(ResultProto());
a.value = v;
a.tag = "ok";
return a;
};
var err = (v) => {
const a = Object.create(ResultProto());
a.value = v;
a.tag = "err";
return a;
};
// src/Option.ts
var isSome = (r) => r.tag === "some";
var isNone = (r) => r.tag === "none";
var OptionProto = () => ({
and(v) {
return isSome(this) ? v : none();
},
andThen(f) {
return isSome(this) ? f(this.value) : none();
},
expect(msg) {
if (isSome(this)) {
return this.value;
} else {
throw new Error(msg);
}
},
filter(f) {
return isNone(this) ? none() : f(this.value) ? this : none();
},
flatten() {
return isSome(this) ? this.value : none();
},
inspect(f) {
if (isSome(this)) {
f(this.value);
return some(this.value);
} else {
return none();
}
},
isNone() {
return isNone(this);
},
isNoneOr(f) {
return isNone(this) || f(this.value);
},
isSome() {
return isSome(this);
},
isSomeAnd(f) {
return isNone(this) ? false : f(this.value);
},
map(f) {
return isSome(this) ? some(f(this.value)) : none();
},
mapOr(def, f) {
return isSome(this) ? f(this.value) : def;
},
mapOrElse(d, f) {
return isSome(this) ? f(this.value) : d();
},
okOr(v) {
return isSome(this) ? ok(this.value) : err(v);
},
okOrElse(f) {
return isSome(this) ? ok(this.value) : err(f());
},
or(v) {
return isSome(this) ? this : v;
},
orElse(f) {
return isSome(this) ? this : f();
},
transpose() {
return isNone(this) ? ok(none()) : isErr(this.value) ? err(this.value.value) : ok(some(this.value.value));
},
unwrap() {
if (isSome(this)) {
return this.value;
} else {
throw new Error("called `Option.unwrap()` on a `None` value");
}
},
unwrapOr(def) {
return isSome(this) ? this.value : def;
},
unwrapOrElse(def) {
return isSome(this) ? this.value : def();
},
xor(v) {
return isSome(this) && isSome(v) ? this : isNone(this) && isSome(v) ? v : none();
},
[Symbol.iterator]() {
return new OnceIterator(this);
}
});
var fromNullable = (v) => v == null ? none() : some(v);
var fromResult = (v) => v.ok();
var tryCatch = (f) => {
try {
return some(f());
} catch (_) {
return none();
}
};
var tryPromise = async (v) => v.then((s) => some(s)).catch((_) => none());
var some = (v) => {
const a = Object.create(OptionProto());
a.value = v;
a.tag = "some";
return a;
};
var none = () => {
const a = Object.create(OptionProto());
a.tag = "none";
return a;
};
var bind = (fn) => {
const iter = fn();
let result = iter.next();
while (true) {
if (result.done) {
return some(result.value);
}
if (isSome(result.value)) {
result = iter.next(result.value.value);
} else {
return result.value;
}
}
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
OptionProto,
bind,
fromNullable,
fromResult,
isNone,
isSome,
none,
some,
tryCatch,
tryPromise
});