perlica
Version:
<h1 align="center">Perlica</h1>
283 lines (279 loc) • 5.94 kB
JavaScript
// 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/Result.ts
var isOk = (r) => r.tag === "ok";
var isErr = (r) => r.tag === "err";
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);
}
});
// 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) => isNotNullable(v) ? some(v) : none();
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;
}
}
};
export {
OptionProto,
bind,
fromNullable,
fromResult,
isNone,
isSome,
none,
some,
tryCatch,
tryPromise
};