My favorite types.
npx jsr add @askua/corePublished to JSR
import { Option, some } from "@askua/core/option";
const n: Option<number> = { some: true, value: 1 };
const a = Option(n);
const b = a.map((n) => n + 1);
const c = b.filter((n) => n > 2);
const d = c.or(() => some(3));
console.log([...a, ...b, ...c, ...d]); // [1, 2, 3] CPU | Apple M2
Runtime | Deno 2.6.1 (aarch64-apple-darwin)
file:///core.js/bench/option_bench.ts
| benchmark | time/iter (avg) | iter/s | (min … max) | p75 | p99 | p995 |
| ----------------------------------------- | --------------- | ------------- | --------------------- | -------- | -------- | -------- |
| Option({ some: true, value }) | 4.1 ns | 243,600,000 | ( 4.0 ns … 8.7 ns) | 4.1 ns | 4.7 ns | 5.0 ns |
| Option({ some: false }) | 4.1 ns | 242,200,000 | ( 4.1 ns … 6.8 ns) | 4.1 ns | 4.7 ns | 5.0 ns |
| some(1) | 3.9 ns | 257,100,000 | ( 3.9 ns … 5.9 ns) | 3.9 ns | 4.4 ns | 4.8 ns |
| none() | 4.0 ns | 251,000,000 | ( 3.9 ns … 8.4 ns) | 4.0 ns | 4.5 ns | 4.9 ns |
| Option.fromNullable(null) | 4.6 ns | 217,400,000 | ( 4.5 ns … 8.6 ns) | 4.6 ns | 5.2 ns | 5.5 ns |
| Option.fromNullable(undefined) | 4.6 ns | 219,300,000 | ( 4.5 ns … 7.9 ns) | 4.5 ns | 5.1 ns | 5.5 ns |
| Option.fromNullable(1) | 4.5 ns | 220,300,000 | ( 4.5 ns … 6.7 ns) | 4.5 ns | 5.1 ns | 5.4 ns |
| some(1).and((n) => some(n + 1)) | 3.9 ns | 255,600,000 | ( 3.9 ns … 6.1 ns) | 3.9 ns | 4.3 ns | 4.6 ns |
| none().and((n) => some(n + 1)) | 3.9 ns | 254,000,000 | ( 3.9 ns … 5.5 ns) | 3.9 ns | 4.5 ns | 4.7 ns |
| some(1).or(() => some(0)) | 3.9 ns | 255,400,000 | ( 3.8 ns … 5.9 ns) | 3.9 ns | 4.4 ns | 4.6 ns |
| none().or(() => some(0)) | 7.0 ns | 142,200,000 | ( 6.4 ns … 10.8 ns) | 6.8 ns | 9.3 ns | 9.7 ns |
| some(1).map((n) => n + 1) | 3.9 ns | 254,700,000 | ( 3.9 ns … 7.8 ns) | 3.9 ns | 4.5 ns | 4.8 ns |
| none().map((n) => n + 1) | 4.0 ns | 249,100,000 | ( 4.0 ns … 6.0 ns) | 4.0 ns | 4.5 ns | 4.8 ns |
| some(1).filter((n) => n > 0) | 3.9 ns | 254,300,000 | ( 3.9 ns … 5.9 ns) | 3.9 ns | 4.5 ns | 4.7 ns |
| some(0).filter((n) => n > 0) | 5.7 ns | 176,300,000 | ( 5.4 ns … 9.2 ns) | 5.5 ns | 7.7 ns | 7.8 ns |
| none().filter((n) => n > 0) | 3.9 ns | 254,400,000 | ( 3.9 ns … 6.0 ns) | 3.9 ns | 4.4 ns | 4.7 ns |
| some(1).unwrap() | 3.9 ns | 256,000,000 | ( 3.9 ns … 6.9 ns) | 3.9 ns | 4.1 ns | 4.2 ns |
| some(1).unwrap(() => 0) | 3.9 ns | 253,600,000 | ( 3.9 ns … 7.6 ns) | 3.9 ns | 4.5 ns | 4.7 ns |
| none().unwrap(() => 0) | 3.9 ns | 254,600,000 | ( 3.9 ns … 5.9 ns) | 3.9 ns | 4.3 ns | 4.6 ns |
| [...some(1)] | 141.4 ns | 7,071,000 | (140.2 ns … 144.9 ns) | 141.7 ns | 144.5 ns | 144.6 ns |
| [...none()] | 113.7 ns | 8,795,000 | (111.8 ns … 118.6 ns) | 114.7 ns | 116.3 ns | 117.4 ns |
| some(1).lazy().map((n) => n + 1).eval() | 128.6 ns | 7,777,000 | (124.2 ns … 187.2 ns) | 126.9 ns | 174.7 ns | 177.0 ns |
| none().lazy().map((n) => n + 1).eval() | 125.3 ns | 7,981,000 | (121.7 ns … 177.9 ns) | 124.8 ns | 139.6 ns | 155.0 ns |
| await Option.and(...) | 247.2 ns | 4,045,000 | (244.8 ns … 250.7 ns) | 248.0 ns | 250.5 ns | 250.6 ns |
| Option.and(...) | 45.4 ns | 22,020,000 | ( 44.7 ns … 49.7 ns) | 45.4 ns | 47.9 ns | 48.2 ns |
| await Option.and(...[len=1000]) | 38.8 µs | 25,800 | ( 38.0 µs … 78.7 µs) | 38.6 µs | 49.1 µs | 54.8 µs |
| Option.and(...[len=1000]) | 9.2 µs | 109,100 | ( 8.5 µs … 95.9 µs) | 9.0 µs | 10.6 µs | 13.4 µs |
| await Option.or(...) | 272.7 ns | 3,666,000 | (268.0 ns … 291.2 ns) | 275.7 ns | 290.9 ns | 291.2 ns |
| Option.or(...) | 45.1 ns | 22,160,000 | ( 43.5 ns … 50.7 ns) | 47.0 ns | 48.5 ns | 48.8 ns |
| await Option.or(...[len=1000]) | 103.4 µs | 9,674 | ( 92.1 µs … 300.2 µs) | 97.0 µs | 187.1 µs | 200.8 µs |
| Option.or(...[len=1000]) | 8.6 µs | 116,400 | ( 8.2 µs … 103.7 µs) | 8.7 µs | 9.4 µs | 9.6 µs |
| Option.lazy()...eval() | 468.5 ns | 2,135,000 | (460.6 ns … 565.5 ns) | 475.3 ns | 490.0 ns | 565.5 ns |
| for (const v of Some(1)) | 101.0 ns | 9,901,000 | ( 98.7 ns … 109.6 ns) | 100.9 ns | 108.2 ns | 108.8 ns |
| for (const _ of None) | 89.2 ns | 11,210,000 | ( 88.0 ns … 98.9 ns) | 89.2 ns | 96.8 ns | 98.0 ns |
| Array.from(Some(1)) | 184.8 ns | 5,410,000 | (182.8 ns … 199.0 ns) | 184.5 ns | 193.6 ns | 196.3 ns |
| Array.from(None) | 162.7 ns | 6,147,000 | (161.1 ns … 175.9 ns) | 162.4 ns | 170.4 ns | 174.0 ns |
file:///core.js/bench/result_bench.ts
| benchmark | time/iter (avg) | iter/s | (min … max) | p75 | p99 | p995 |
| --------------------------------------------- | --------------- | ------------- | --------------------- | -------- | -------- | -------- |
| Result({ ok: true, value }) | 4.1 ns | 241,100,000 | ( 4.1 ns … 9.0 ns) | 4.1 ns | 4.7 ns | 5.0 ns |
| Result({ ok: false, error }) | 4.2 ns | 235,600,000 | ( 4.2 ns … 7.0 ns) | 4.2 ns | 4.8 ns | 5.1 ns |
| ok(1) | 3.9 ns | 257,100,000 | ( 3.9 ns … 7.7 ns) | 3.9 ns | 4.4 ns | 4.7 ns |
| err(0) | 3.9 ns | 254,600,000 | ( 3.9 ns … 8.9 ns) | 3.9 ns | 4.5 ns | 4.8 ns |
| Result.try(fn: () => number) | 4.7 ns | 211,200,000 | ( 4.7 ns … 6.9 ns) | 4.7 ns | 5.3 ns | 5.6 ns |
| Result.try(fn: () => Promise<number>) | 154.0 ns | 6,493,000 | (149.1 ns … 206.9 ns) | 152.5 ns | 201.1 ns | 203.3 ns |
| Result.try(fn: () => throw number) | 2.0 µs | 494,000 | ( 2.0 µs … 2.1 µs) | 2.0 µs | 2.1 µs | 2.1 µs |
| Result.try(fn: () => Promise<throw number>) | 415.3 ns | 2,408,000 | (407.7 ns … 496.5 ns) | 421.8 ns | 465.8 ns | 496.5 ns |
| ok(1).and((n) => ok(n + 1)) | 3.9 ns | 257,600,000 | ( 3.9 ns … 6.6 ns) | 3.9 ns | 4.4 ns | 4.6 ns |
| err(0).and((n) => ok(n + 1)) | 4.0 ns | 252,800,000 | ( 3.9 ns … 97.9 ns) | 3.9 ns | 4.9 ns | 5.5 ns |
| ok(1).or(() => ok(0)) | 3.9 ns | 256,500,000 | ( 3.9 ns … 6.7 ns) | 3.9 ns | 4.5 ns | 4.8 ns |
| err(0).or(() => ok(0)) | 7.2 ns | 139,200,000 | ( 6.5 ns … 11.1 ns) | 7.1 ns | 9.9 ns | 10.0 ns |
| ok(1).map((n) => n + 1) | 3.9 ns | 256,500,000 | ( 3.9 ns … 6.6 ns) | 3.9 ns | 4.4 ns | 4.6 ns |
| err(0).map((n) => n + 1) | 4.0 ns | 247,200,000 | ( 3.9 ns … 91.4 ns) | 4.0 ns | 5.9 ns | 9.2 ns |
| ok(1).filter((n) => n > 0) | 3.9 ns | 255,900,000 | ( 3.9 ns … 36.4 ns) | 3.9 ns | 4.6 ns | 4.9 ns |
| ok(0).filter((n) => n > 0) | 9.9 ns | 101,200,000 | ( 9.2 ns … 14.6 ns) | 9.9 ns | 12.4 ns | 12.6 ns |
| ok(0).filter((n) => n > 0, () => 0) | 9.9 ns | 101,300,000 | ( 9.2 ns … 13.5 ns) | 9.8 ns | 12.0 ns | 12.4 ns |
| err(0).filter((n) => n + 0) | 3.9 ns | 256,600,000 | ( 3.9 ns … 6.7 ns) | 3.9 ns | 4.4 ns | 4.7 ns |
| ok(1).unwrap() | 3.9 ns | 257,000,000 | ( 3.9 ns … 7.9 ns) | 3.9 ns | 4.3 ns | 4.5 ns |
| ok(1).unwrap(() => 0) | 3.9 ns | 256,600,000 | ( 3.9 ns … 6.7 ns) | 3.9 ns | 4.2 ns | 4.5 ns |
| err(1).unwrap(() => 0) | 3.9 ns | 258,100,000 | ( 3.8 ns … 5.6 ns) | 3.9 ns | 4.2 ns | 4.5 ns |
| await Result.and(...) | 246.6 ns | 4,055,000 | (244.3 ns … 251.9 ns) | 247.2 ns | 250.2 ns | 251.7 ns |
| Result.and(...) | 45.7 ns | 21,880,000 | ( 45.0 ns … 50.2 ns) | 45.9 ns | 48.5 ns | 48.6 ns |
| await Result.and(...[len=1000]) | 38.7 µs | 25,860 | ( 37.5 µs … 107.3 µs) | 38.5 µs | 51.8 µs | 54.9 µs |
| Result.and(...[len=1000]) | 9.2 µs | 108,800 | ( 8.5 µs … 104.7 µs) | 9.0 µs | 10.7 µs | 14.6 µs |
| await Result.or(...) | 274.8 ns | 3,639,000 | (270.5 ns … 295.0 ns) | 275.7 ns | 293.1 ns | 295.0 ns |
| Result.or(...) | 46.1 ns | 21,700,000 | ( 44.1 ns … 52.9 ns) | 48.0 ns | 50.0 ns | 50.2 ns |
| await Result.or(...[len=1000]) | 103.8 µs | 9,635 | ( 91.3 µs … 441.2 µs) | 97.5 µs | 195.3 µs | 211.0 µs |
| Result.or(...[len=1000]) | 9.1 µs | 109,300 | ( 8.7 µs … 111.0 µs) | 9.2 µs | 10.0 µs | 11.9 µs |
| Result.fromOption(some(0)) | 5.0 ns | 200,500,000 | ( 5.0 ns … 7.3 ns) | 5.0 ns | 5.3 ns | 5.5 ns |
| Result.fromOption(some(0), () => string) | 5.0 ns | 200,700,000 | ( 5.0 ns … 7.5 ns) | 5.0 ns | 5.3 ns | 5.3 ns |
| Result.fromOption(none()) | 6.0 ns | 165,400,000 | ( 5.9 ns … 17.9 ns) | 6.0 ns | 7.8 ns | 11.1 ns |
| Result.fromOption(none(), () => string) | 6.1 ns | 164,500,000 | ( 5.9 ns … 17.2 ns) | 6.0 ns | 8.0 ns | 11.0 ns |
| Result.lazy()...eval() | 317.8 ns | 3,146,000 | (308.9 ns … 387.5 ns) | 318.5 ns | 349.4 ns | 387.5 ns |