UNPKG

perlica

Version:

<h1 align="center">Perlica</h1>

299 lines (295 loc) 6.41 kB
// 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/Predicate/index.ts var isNotNull = (value) => value !== null; var isNotUndefined = (value) => value !== void 0; var isNotNullable = (value) => isNotNull(value) && isNotUndefined(value); // 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 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; }; // src/Result.ts var and = (self, that) => self.and(that); var andThen = (self, f) => self.andThen(f); var expect = (self, msg) => self.expect(msg); var expectErr = (self, msg) => self.expectErr(msg); var isOk = (r) => r.tag === "ok"; var isErr = (r) => r.tag === "err"; var unwrap = (self) => self.unwrap(); var unwrapErr = (self) => self.unwrapErr(); var unwrapOr = (self, def) => self.unwrapOr(def); var unwrapOrElse = (self, def) => self.unwrapOrElse(def); var fromNullable = (v, f) => isNotNullable(v) ? ok(v) : err(f()); var fromOption = (self, f) => self.okOr(f()); var tryCatch = (f) => { try { return ok(f()); } catch (e) { return err(e); } }; var tryPromise = async (v) => v.then((s) => ok(s)).catch((f) => err(f)); var bind = (fn) => { const iter = fn(); let result = iter.next(); while (true) { if (result.done) { return ok(result.value); } if (isOk(result.value)) { result = iter.next(result.value.value); } else { return result.value; } } }; 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; }; var ResultProto = () => ({ and(res) { return isOk(this) ? res : 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.unwrapErr()\` 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); } }); export { ResultProto, and, andThen, bind, err, expect, expectErr, fromNullable, fromOption, isErr, isOk, ok, tryCatch, tryPromise, unwrap, unwrapErr, unwrapOr, unwrapOrElse };