@chocbite/ts-lib-result 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,151 @@
1
+ interface OptionBase<T> {
2
+ /**Is true when a value is available*/
3
+ readonly some: boolean;
4
+ /**Is true when no value is available*/
5
+ readonly none: boolean;
6
+ /**The value*/
7
+ readonly value?: T;
8
+ /**Returns the contained value, if exists. Throws an error if not.
9
+ * @param msg the message to throw if no value exists.*/
10
+ expect(msg: string): T;
11
+ /**Returns the contained value, if exists. Throws an error if not.*/
12
+ get unwrap(): T;
13
+ /**Returns the contained value or a provided default.
14
+ * @param value value to use as default*/
15
+ unwrap_or<T2>(value: T2): T | T2;
16
+ /**Calls mapper if the Option is `Some`, otherwise returns `None`.
17
+ * This function can be used for control flow based on `Optional` values.*/
18
+ and_then<T2>(mapper: (value: T) => OptionSome<T2>): Option<T2>;
19
+ and_then(mapper: (value: T) => OptionNone): Option<T>;
20
+ and_then<T2>(mapper: (value: T) => Option<T2>): Option<T2>;
21
+ /**Calls mapper if the Option is `None`, otherwise returns `Some`.
22
+ * This function can be used for control flow based on `Optional` values.*/
23
+ or_else<T2>(mapper: () => OptionSome<T2>): Option<T2>;
24
+ or_else(mapper: () => OptionNone): Option<T>;
25
+ or_else<T2>(mapper: () => Option<T2>): Option<T2>;
26
+ /**Maps an `Optional<T>` to `Optional<U>` by applying a function to a contained `Some` value, leaving a `None` value untouched.
27
+ * This function can be used to compose the Options of two functions.*/
28
+ map<U>(mapper: (value: T) => U): Option<U>;
29
+ /**Compares two `Optional<T>` values for equality.
30
+ * @returns true if equal, false otherwise. */
31
+ compare(other: Option<T>): boolean;
32
+ /**Maps an `Optional<T>` to a `Result<T, E>`.*/
33
+ to_result<E>(error: E): Result<T, E>;
34
+ }
35
+ declare class OptionSome<T> implements OptionBase<T> {
36
+ readonly value: T;
37
+ constructor(value: T);
38
+ get some(): true;
39
+ get none(): false;
40
+ expect(): T;
41
+ get unwrap(): T;
42
+ unwrap_or(): T;
43
+ and_then<T2>(mapper: (value: T) => OptionSome<T2>): OptionSome<T2>;
44
+ and_then(mapper: (value: T) => OptionNone): OptionNone;
45
+ and_then<T2>(mapper: (value: T) => Option<T2>): Option<T2>;
46
+ or_else(): OptionSome<T>;
47
+ map<U>(mapper: (value: T) => U): OptionSome<U>;
48
+ compare(other: Option<T>): boolean;
49
+ to_result(): ResultOk<T>;
50
+ }
51
+ declare class OptionNone implements OptionBase<never> {
52
+ get some(): false;
53
+ get none(): true;
54
+ expect(msg: string): never;
55
+ get unwrap(): never;
56
+ unwrap_or<T2>(val: T2): T2;
57
+ and_then(): OptionNone;
58
+ or_else<T2>(mapper: () => OptionSome<T2>): OptionSome<T2>;
59
+ or_else(mapper: () => OptionNone): OptionNone;
60
+ or_else<T2>(mapper: () => Option<T2>): Option<T2>;
61
+ map(): OptionNone;
62
+ compare(other: Option<never>): boolean;
63
+ to_result<E>(error: E): ResultErr<E>;
64
+ }
65
+ interface ResultBase<T, E> {
66
+ /**Is true when the result is valid and false when it is invalid*/
67
+ readonly ok: boolean;
68
+ /**Is false when the result is valid and true when it is invalid*/
69
+ readonly err: boolean;
70
+ /**The value for the result, only exists when it is valid*/
71
+ readonly value?: T;
72
+ /**The error for the result, only exists when it is invalid*/
73
+ readonly error?: E;
74
+ /**Returns the contained valid value, if exists. Throws an error if not.
75
+ * @param msg the message to throw if the value is invalid.*/
76
+ expect(msg: string): T;
77
+ /**Returns the contained valid value, if does not exist. Throws an error if it does.
78
+ * @param msg the message to throw if the value is valid.*/
79
+ expect_err(msg: string): E;
80
+ /**Returns the contained valid value.
81
+ * Throws if the value is invalid, with a message provided by the error's value.*/
82
+ get unwrap(): T;
83
+ /**Returns the contained valid value or a provided default.*/
84
+ unwrap_or<T2>(value: T2): T | T2;
85
+ /**Calls mapper function if the result is valid, otherwise returns the error value of self.
86
+ * This function can be used for control flow based on `Result` values.*/
87
+ and_then<T2>(mapper: (value: T) => ResultOk<T2>): Result<T2, E>;
88
+ and_then<E2>(mapper: (value: T) => ResultErr<E2>): Result<T, E2>;
89
+ and_then<T2, E2>(mapper: (value: T) => Result<T2, E2>): Result<T2, E2>;
90
+ /**Calls mapper function if the result is an error, otherwise returns the value self.
91
+ * This function can be used for control flow based on `Result` values.*/
92
+ or_else<T2>(mapper: (error: E) => ResultOk<T2>): Result<T2, E>;
93
+ or_else<E2>(mapper: (error: E) => ResultErr<E2>): Result<T, E2>;
94
+ or_else<T2, E2>(mapper: (error: E) => Result<T2, E2>): Result<T2, E2>;
95
+ /**Maps a `Result<T, E>` to `Result<U, E>` by applying a function to a contained valid value, leaving an error value untouched.
96
+ * This function can be used to compose the results of two functions.*/
97
+ map<U>(mapper: (value: T) => U): Result<U, E>;
98
+ /**Maps a `Result<T, E>` to `Result<T, F>` by applying a function to a contained error value, leaving a valid value untouched.
99
+ * This function can be used to pass through a successful result while handling an error.*/
100
+ map_err<F>(mapper: (error: E) => F): Result<T, F>;
101
+ /**Compares two `Result<T, E>` values for equality.
102
+ * @returns true if equal, false otherwise. */
103
+ compare(other: Result<T, E>): boolean;
104
+ /**Converts from `Result<T, E>` to `Optional<T>`, discarding the error if any*/
105
+ get to_option(): Option<T>;
106
+ }
107
+ declare class ResultOk<T> implements ResultBase<T, never> {
108
+ readonly value: T;
109
+ constructor(value: T);
110
+ get ok(): true;
111
+ get err(): false;
112
+ expect(): T;
113
+ expect_err(msg: string): never;
114
+ get unwrap(): T;
115
+ unwrap_or(): T;
116
+ and_then<T2>(mapper: (value: T) => ResultOk<T2>): ResultOk<T2>;
117
+ and_then<E2>(mapper: (value: T) => ResultErr<E2>): ResultErr<E2>;
118
+ and_then<T2, E2>(mapper: (value: T) => Result<T2, E2>): Result<T2, E2>;
119
+ or_else(): ResultOk<T>;
120
+ map<U>(func: (value: T) => U): ResultOk<U>;
121
+ map_err(): ResultOk<T>;
122
+ compare(other: Result<T, any>): boolean;
123
+ get to_option(): OptionSome<T>;
124
+ }
125
+ declare class ResultErr<E> implements ResultBase<never, E> {
126
+ readonly error: E;
127
+ constructor(error: E);
128
+ get valid(): false;
129
+ get ok(): false;
130
+ get err(): true;
131
+ expect(msg: string): never;
132
+ expect_err(): E;
133
+ get unwrap(): never;
134
+ unwrap_or<T2>(val: T2): T2;
135
+ and_then(): ResultErr<E>;
136
+ or_else<T2>(mapper: (error: E) => ResultOk<T2>): ResultOk<T2>;
137
+ or_else<E2>(mapper: (error: E) => ResultErr<E2>): ResultErr<E2>;
138
+ or_else<T2, E2>(mapper: (error: E) => Result<T2, E2>): Result<T2, E2>;
139
+ map(): ResultErr<E>;
140
+ map_err<F>(mapper: (error: E) => F): ResultErr<F>;
141
+ compare(other: Result<any, E>): boolean;
142
+ get to_option(): OptionNone;
143
+ }
144
+ type Result<T, E> = ResultOk<T> | ResultErr<E>;
145
+ type Option<T> = OptionSome<T> | OptionNone;
146
+ declare function ok<T>(value: T): ResultOk<T>;
147
+ declare function err<E>(error: E): ResultErr<E>;
148
+ declare function some<T>(value: T): OptionSome<T>;
149
+ declare function none(): OptionNone;
150
+
151
+ export { type Option, OptionNone, OptionSome, type Result, ResultErr, ResultOk, err, none, ok, some };
package/dist/index.js ADDED
@@ -0,0 +1,178 @@
1
+ // src/index.ts
2
+ var OptionSome = class _OptionSome {
3
+ value;
4
+ constructor(value) {
5
+ this.value = value;
6
+ }
7
+ get some() {
8
+ return true;
9
+ }
10
+ get none() {
11
+ return false;
12
+ }
13
+ expect() {
14
+ return this.value;
15
+ }
16
+ get unwrap() {
17
+ return this.value;
18
+ }
19
+ unwrap_or() {
20
+ return this.value;
21
+ }
22
+ and_then(mapper) {
23
+ return mapper(this.value);
24
+ }
25
+ or_else() {
26
+ return this;
27
+ }
28
+ map(mapper) {
29
+ return new _OptionSome(mapper(this.value));
30
+ }
31
+ compare(other) {
32
+ return other.some && this.value === other.value;
33
+ }
34
+ to_result() {
35
+ return new ResultOk(this.value);
36
+ }
37
+ };
38
+ var OptionNone = class {
39
+ get some() {
40
+ return false;
41
+ }
42
+ get none() {
43
+ return true;
44
+ }
45
+ expect(msg) {
46
+ throw new Error(msg);
47
+ }
48
+ get unwrap() {
49
+ throw new Error(`Tried to unwrap None`);
50
+ }
51
+ unwrap_or(val) {
52
+ return val;
53
+ }
54
+ and_then() {
55
+ return this;
56
+ }
57
+ or_else(mapper) {
58
+ return mapper();
59
+ }
60
+ map() {
61
+ return this;
62
+ }
63
+ compare(other) {
64
+ return other.none;
65
+ }
66
+ to_result(error) {
67
+ return new ResultErr(error);
68
+ }
69
+ };
70
+ var ResultOk = class _ResultOk {
71
+ value;
72
+ constructor(value) {
73
+ this.value = value;
74
+ }
75
+ get ok() {
76
+ return true;
77
+ }
78
+ get err() {
79
+ return false;
80
+ }
81
+ expect() {
82
+ return this.value;
83
+ }
84
+ expect_err(msg) {
85
+ throw new Error(msg);
86
+ }
87
+ get unwrap() {
88
+ return this.value;
89
+ }
90
+ unwrap_or() {
91
+ return this.value;
92
+ }
93
+ and_then(mapper) {
94
+ return mapper(this.value);
95
+ }
96
+ or_else() {
97
+ return this;
98
+ }
99
+ map(func) {
100
+ return new _ResultOk(func(this.value));
101
+ }
102
+ map_err() {
103
+ return this;
104
+ }
105
+ compare(other) {
106
+ return other.ok && this.value === other.value;
107
+ }
108
+ get to_option() {
109
+ return new OptionSome(this.value);
110
+ }
111
+ };
112
+ var ResultErr = class _ResultErr {
113
+ error;
114
+ constructor(error) {
115
+ this.error = error;
116
+ }
117
+ get valid() {
118
+ return false;
119
+ }
120
+ get ok() {
121
+ return false;
122
+ }
123
+ get err() {
124
+ return true;
125
+ }
126
+ expect(msg) {
127
+ throw new Error(msg + "\nOriginal " + this.error);
128
+ }
129
+ expect_err() {
130
+ return this.error;
131
+ }
132
+ get unwrap() {
133
+ throw new Error("Tried to unwrap Error\nOriginal " + this.error);
134
+ }
135
+ unwrap_or(val) {
136
+ return val;
137
+ }
138
+ and_then() {
139
+ return this;
140
+ }
141
+ or_else(mapper) {
142
+ return mapper(this.error);
143
+ }
144
+ map() {
145
+ return this;
146
+ }
147
+ map_err(mapper) {
148
+ return new _ResultErr(mapper(this.error));
149
+ }
150
+ compare(other) {
151
+ return other.err && this.error === other.error;
152
+ }
153
+ get to_option() {
154
+ return new OptionNone();
155
+ }
156
+ };
157
+ function ok(value) {
158
+ return new ResultOk(value);
159
+ }
160
+ function err(error) {
161
+ return new ResultErr(error);
162
+ }
163
+ function some(value) {
164
+ return new OptionSome(value);
165
+ }
166
+ function none() {
167
+ return new OptionNone();
168
+ }
169
+ export {
170
+ OptionNone,
171
+ OptionSome,
172
+ ResultErr,
173
+ ResultOk,
174
+ err,
175
+ none,
176
+ ok,
177
+ some
178
+ };
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@chocbite/ts-lib-result",
3
+ "version": "1.0.0",
4
+ "description": "Rust like result type for TypeScript",
5
+ "author": "chocolateandmilkwin",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "private": false,
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "dev": "vite --port 9951",
25
+ "build": "tsup src/index.ts --format esm --dts",
26
+ "lint": "eslint src/**/*.ts",
27
+ "test": "vitest run",
28
+ "prepublishOnly": "npm run build"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.0.0",
32
+ "tsup": "^8.0.0",
33
+ "vite": "^7.0.0",
34
+ "vitest": "^4.0.0",
35
+ "eslint": "^9.0.0",
36
+ "typescript-eslint": "^8.0.0",
37
+ "@vitest/browser-playwright": "^4.0.0"
38
+ }
39
+ }