@lsby/ts-fp-data 0.0.9-beta.2 → 0.0.9

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.
@@ -35,9 +35,6 @@ var Just = class _Just extends Maybe {
35
35
  super();
36
36
  this.\u503C = \u503C;
37
37
  }
38
- match(onJust, _onNothing) {
39
- return onJust(this.\u503C);
40
- }
41
38
  map(f) {
42
39
  return new _Just(f(this.\u503C));
43
40
  }
@@ -50,17 +47,23 @@ var Just = class _Just extends Maybe {
50
47
  isNothing() {
51
48
  return false;
52
49
  }
50
+ assertJust() {
51
+ return this;
52
+ }
53
+ assertNothing() {
54
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
55
+ }
53
56
  getJust() {
54
57
  return this.\u503C;
55
58
  }
56
59
  getJustOrNull() {
57
60
  return this.\u503C;
58
61
  }
62
+ match(onJust, _onNothing) {
63
+ return onJust(this.\u503C);
64
+ }
59
65
  };
60
66
  var Nothing = class _Nothing extends Maybe {
61
- match(_onJust, onNothing) {
62
- return onNothing();
63
- }
64
67
  map(_f) {
65
68
  return new _Nothing();
66
69
  }
@@ -73,9 +76,18 @@ var Nothing = class _Nothing extends Maybe {
73
76
  isNothing() {
74
77
  return true;
75
78
  }
79
+ assertJust() {
80
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
81
+ }
82
+ assertNothing() {
83
+ return this;
84
+ }
76
85
  getJustOrNull() {
77
86
  return null;
78
87
  }
88
+ match(_onJust, onNothing) {
89
+ return onNothing();
90
+ }
79
91
  };
80
92
  // Annotate the CommonJS export names for ESM import in node:
81
93
  0 && (module.exports = {
@@ -4,27 +4,33 @@ declare abstract class Maybe<A> {
4
4
  abstract bind<B>(f: (a: A) => Maybe<B>): Maybe<B>;
5
5
  abstract isJust(): this is Just<A>;
6
6
  abstract isNothing(): this is Nothing<A>;
7
+ abstract assertJust(): Just<A>;
8
+ abstract assertNothing(): Nothing<A>;
7
9
  abstract getJustOrNull(): A | null;
8
10
  abstract match<B>(onJust: (a: A) => B, onNothing: () => B): B;
9
11
  }
10
12
  declare class Just<A> extends Maybe<A> {
11
13
  private 值;
12
14
  constructor(值: A);
13
- match<B>(onJust: (a: A) => B, _onNothing: () => B): B;
14
15
  map<B>(f: (a: A) => B): Maybe<B>;
15
16
  bind<B>(f: (a: A) => Maybe<B>): Maybe<B>;
16
17
  isJust(): this is Just<A>;
17
18
  isNothing(): this is Nothing<A>;
19
+ assertJust(): Just<A>;
20
+ assertNothing(): Nothing<A>;
18
21
  getJust(): A;
19
22
  getJustOrNull(): A | null;
23
+ match<B>(onJust: (a: A) => B, _onNothing: () => B): B;
20
24
  }
21
25
  declare class Nothing<A> extends Maybe<A> {
22
- match<B>(_onJust: (a: A) => B, onNothing: () => B): B;
23
26
  map<B>(_f: (a: A) => B): Maybe<B>;
24
27
  bind<B>(_f: (a: A) => Maybe<B>): Maybe<B>;
25
28
  isJust(): this is Just<A>;
26
29
  isNothing(): this is Nothing<A>;
30
+ assertJust(): Just<A>;
31
+ assertNothing(): Nothing<A>;
27
32
  getJustOrNull(): A | null;
33
+ match<B>(_onJust: (a: A) => B, onNothing: () => B): B;
28
34
  }
29
35
 
30
36
  export { Just, Maybe, Nothing };
@@ -112,25 +112,52 @@ var TaskDo = class _TaskDo {
112
112
  let(name, task) {
113
113
  return new _TaskDo(
114
114
  this.accTask.bind(
115
- (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v }))
115
+ (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
116
116
  )
117
117
  );
118
118
  }
119
119
  bind(name, task) {
120
120
  return new _TaskDo(
121
- this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v })))
121
+ this.accTask.bind(
122
+ (a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
123
+ )
122
124
  );
123
125
  }
124
126
  exec(task) {
125
- return new _TaskDo(this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
127
+ return new _TaskDo(
128
+ this.accTask.bind((a) => task(a.env).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
129
+ );
126
130
  }
127
131
  effect(task) {
132
+ return new _TaskDo(
133
+ this.accTask.bind((a) => Task.pure(task(a.env)).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
134
+ );
135
+ }
136
+ pure(task) {
128
137
  return new _TaskDo(
129
138
  this.accTask.bind((a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v })))
130
139
  );
131
140
  }
132
- pure(value) {
133
- return new _TaskDo(this.accTask.bind((a) => Task.pure(value).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
141
+ if(cond, task) {
142
+ return new _TaskDo(
143
+ this.accTask.bind(
144
+ (a) => Task.pure(cond(a.env)).bind(
145
+ (c) => c ? Task.pure(task(a.env)).bind((x) => Task.pure({ env: a.env, lastValue: x, lock: true })) : Task.pure({
146
+ env: a.env,
147
+ /*从类型可以确保if没命中的情况pureIf来补充正确的候选值, 所以这里跳过ts检查*/
148
+ lastValue: a.lastValue,
149
+ lock: false
150
+ })
151
+ )
152
+ )
153
+ );
154
+ }
155
+ pureR(task) {
156
+ return new _TaskDo(
157
+ this.accTask.bind(
158
+ (a) => a.lock ? Task.pure(a) : Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v }))
159
+ )
160
+ );
134
161
  }
135
162
  getTask() {
136
163
  return new Task(async () => {
@@ -157,6 +184,9 @@ var Task = class _Task {
157
184
  run() {
158
185
  return this.f();
159
186
  }
187
+ do() {
188
+ return new TaskDo(this.bind((a) => _Task.pure({ env: {}, lastValue: a })));
189
+ }
160
190
  async tryRun() {
161
191
  try {
162
192
  return new Right(await this.run());
@@ -1,35 +1,51 @@
1
1
  import { Either } from './either.cjs';
2
2
 
3
- interface TaskDoType<Env extends Record<string, any>, A> {
4
- let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoType<Env & Record<K, X>, X>;
5
- bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoType<Env & Record<K, X>, X>;
6
- exec<X>(task: (env: Env) => Task<X>): TaskDoType<Env, X>;
7
- effect<X>(task: (env: Env) => X): TaskDoType<Env, X>;
8
- pure<X>(value: X): TaskDoType<Env, X>;
3
+ type TaskDoTypeBase<Env extends Record<string, any>, A> = {
4
+ let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoTypeNoGet<Env & Record<K, X>, A>;
5
+ bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env & Record<K, X>, A>;
6
+ exec<X>(task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env, A>;
7
+ effect<X>(task: (env: Env) => X): TaskDoTypeNoGet<Env, A>;
8
+ };
9
+ type TaskDoTypeReturn<Env extends Record<string, any>, _A> = {
10
+ pure<X>(task: (env: Env) => X): TaskDoTypeGet<Env, X>;
11
+ };
12
+ type TaskDoTypeIf<Env extends Record<string, any>, _A> = {
13
+ if<X>(cond: (env: Env) => boolean, task: (env: Env) => X): TaskDoTypeIfReturn<Env, X>;
14
+ };
15
+ type TaskDoTypeIfReturn<Env extends Record<string, any>, A> = {
16
+ pureR(task: (env: Env) => A): TaskDoTypeGet<Env, A>;
17
+ };
18
+ type TaskDoTypeGet<_Env extends Record<string, any>, A> = {
9
19
  getTask(): Task<A>;
10
- }
20
+ };
21
+ type TaskDoTypeNoGet<Env extends Record<string, any>, A> = TaskDoTypeBase<Env, A> & TaskDoTypeReturn<Env, A> & TaskDoTypeIf<Env, A>;
22
+ type TaskDoType<Env extends Record<string, any>, A> = TaskDoTypeBase<Env, A> & TaskDoTypeReturn<Env, A> & TaskDoTypeGet<Env, A> & TaskDoTypeIf<Env, A> & TaskDoTypeIfReturn<Env, A>;
11
23
  declare class TaskDo<Env extends Record<string, any>, A> implements TaskDoType<Env, A> {
12
24
  private accTask;
13
25
  constructor(accTask: Task<{
14
26
  env: Env;
15
27
  lastValue: A;
28
+ lock?: boolean;
16
29
  }>);
17
- let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoType<Env & Record<K, X>, X>;
18
- bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoType<Env & Record<K, X>, X>;
19
- exec<X>(task: (env: Env) => Task<X>): TaskDoType<Env, X>;
20
- effect<X>(task: (env: Env) => X): TaskDoType<Env, X>;
21
- pure<X>(value: X): TaskDoType<Env, X>;
30
+ let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoTypeNoGet<Env & Record<K, X>, A>;
31
+ bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env & Record<K, X>, A>;
32
+ exec<X>(task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env, A>;
33
+ effect<X>(task: (env: Env) => X): TaskDoTypeNoGet<Env, A>;
34
+ pure<X>(task: (env: Env) => X): TaskDoTypeGet<Env, X>;
35
+ if<X>(cond: (env: Env) => boolean, task: (env: Env) => X): TaskDoTypeIfReturn<Env, X>;
36
+ pureR(task: (env: Env) => A): TaskDoTypeGet<Env, A>;
22
37
  getTask(): Task<A>;
23
38
  }
24
39
  declare class Task<A> {
25
40
  private f;
26
41
  static pure<A>(a: A): Task<A>;
27
- static do(): TaskDo<Record<string, any>, void>;
42
+ static do(): TaskDoTypeBase<Record<string, any>, void>;
28
43
  constructor(f: () => Promise<A>);
29
44
  map<B>(f: (a: A) => B): Task<B>;
30
45
  bind<B>(f: (a: A) => Task<B>): Task<B>;
31
46
  run(): Promise<A>;
47
+ do(): TaskDoTypeBase<{}, A>;
32
48
  tryRun(): Promise<Either<Error, A>>;
33
49
  }
34
50
 
35
- export { Task, TaskDo, type TaskDoType };
51
+ export { Task, TaskDo, type TaskDoType, type TaskDoTypeBase, type TaskDoTypeGet, type TaskDoTypeIf, type TaskDoTypeIfReturn, type TaskDoTypeNoGet, type TaskDoTypeReturn };
@@ -114,25 +114,52 @@ var TaskDo = class _TaskDo {
114
114
  let(name, task) {
115
115
  return new _TaskDo(
116
116
  this.accTask.bind(
117
- (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v }))
117
+ (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
118
118
  )
119
119
  );
120
120
  }
121
121
  bind(name, task) {
122
122
  return new _TaskDo(
123
- this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v })))
123
+ this.accTask.bind(
124
+ (a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
125
+ )
124
126
  );
125
127
  }
126
128
  exec(task) {
127
- return new _TaskDo(this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
129
+ return new _TaskDo(
130
+ this.accTask.bind((a) => task(a.env).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
131
+ );
128
132
  }
129
133
  effect(task) {
134
+ return new _TaskDo(
135
+ this.accTask.bind((a) => Task.pure(task(a.env)).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
136
+ );
137
+ }
138
+ pure(task) {
130
139
  return new _TaskDo(
131
140
  this.accTask.bind((a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v })))
132
141
  );
133
142
  }
134
- pure(value) {
135
- return new _TaskDo(this.accTask.bind((a) => Task.pure(value).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
143
+ if(cond, task) {
144
+ return new _TaskDo(
145
+ this.accTask.bind(
146
+ (a) => Task.pure(cond(a.env)).bind(
147
+ (c) => c ? Task.pure(task(a.env)).bind((x) => Task.pure({ env: a.env, lastValue: x, lock: true })) : Task.pure({
148
+ env: a.env,
149
+ /*从类型可以确保if没命中的情况pureIf来补充正确的候选值, 所以这里跳过ts检查*/
150
+ lastValue: a.lastValue,
151
+ lock: false
152
+ })
153
+ )
154
+ )
155
+ );
156
+ }
157
+ pureR(task) {
158
+ return new _TaskDo(
159
+ this.accTask.bind(
160
+ (a) => a.lock ? Task.pure(a) : Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v }))
161
+ )
162
+ );
136
163
  }
137
164
  getTask() {
138
165
  return new Task(async () => {
@@ -159,6 +186,9 @@ var Task = class _Task {
159
186
  run() {
160
187
  return this.f();
161
188
  }
189
+ do() {
190
+ return new TaskDo(this.bind((a) => _Task.pure({ env: {}, lastValue: a })));
191
+ }
162
192
  async tryRun() {
163
193
  try {
164
194
  return new Right(await this.run());
@@ -122,25 +122,52 @@ var TaskDo = class _TaskDo {
122
122
  let(name, task) {
123
123
  return new _TaskDo(
124
124
  this.accTask.bind(
125
- (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v }))
125
+ (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
126
126
  )
127
127
  );
128
128
  }
129
129
  bind(name, task) {
130
130
  return new _TaskDo(
131
- this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v })))
131
+ this.accTask.bind(
132
+ (a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
133
+ )
132
134
  );
133
135
  }
134
136
  exec(task) {
135
- return new _TaskDo(this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
137
+ return new _TaskDo(
138
+ this.accTask.bind((a) => task(a.env).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
139
+ );
136
140
  }
137
141
  effect(task) {
142
+ return new _TaskDo(
143
+ this.accTask.bind((a) => Task.pure(task(a.env)).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
144
+ );
145
+ }
146
+ pure(task) {
138
147
  return new _TaskDo(
139
148
  this.accTask.bind((a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v })))
140
149
  );
141
150
  }
142
- pure(value) {
143
- return new _TaskDo(this.accTask.bind((a) => Task.pure(value).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
151
+ if(cond, task) {
152
+ return new _TaskDo(
153
+ this.accTask.bind(
154
+ (a) => Task.pure(cond(a.env)).bind(
155
+ (c) => c ? Task.pure(task(a.env)).bind((x) => Task.pure({ env: a.env, lastValue: x, lock: true })) : Task.pure({
156
+ env: a.env,
157
+ /*从类型可以确保if没命中的情况pureIf来补充正确的候选值, 所以这里跳过ts检查*/
158
+ lastValue: a.lastValue,
159
+ lock: false
160
+ })
161
+ )
162
+ )
163
+ );
164
+ }
165
+ pureR(task) {
166
+ return new _TaskDo(
167
+ this.accTask.bind(
168
+ (a) => a.lock ? Task.pure(a) : Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v }))
169
+ )
170
+ );
144
171
  }
145
172
  getTask() {
146
173
  return new Task(async () => {
@@ -167,6 +194,9 @@ var Task = class _Task {
167
194
  run() {
168
195
  return this.f();
169
196
  }
197
+ do() {
198
+ return new TaskDo(this.bind((a) => _Task.pure({ env: {}, lastValue: a })));
199
+ }
170
200
  async tryRun() {
171
201
  try {
172
202
  return new Right(await this.run());
@@ -189,9 +219,6 @@ var Just = class _Just extends Maybe {
189
219
  super();
190
220
  this.\u503C = \u503C;
191
221
  }
192
- match(onJust, _onNothing) {
193
- return onJust(this.\u503C);
194
- }
195
222
  map(f) {
196
223
  return new _Just(f(this.\u503C));
197
224
  }
@@ -204,17 +231,23 @@ var Just = class _Just extends Maybe {
204
231
  isNothing() {
205
232
  return false;
206
233
  }
234
+ assertJust() {
235
+ return this;
236
+ }
237
+ assertNothing() {
238
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
239
+ }
207
240
  getJust() {
208
241
  return this.\u503C;
209
242
  }
210
243
  getJustOrNull() {
211
244
  return this.\u503C;
212
245
  }
246
+ match(onJust, _onNothing) {
247
+ return onJust(this.\u503C);
248
+ }
213
249
  };
214
250
  var Nothing = class _Nothing extends Maybe {
215
- match(_onJust, onNothing) {
216
- return onNothing();
217
- }
218
251
  map(_f) {
219
252
  return new _Nothing();
220
253
  }
@@ -227,9 +260,18 @@ var Nothing = class _Nothing extends Maybe {
227
260
  isNothing() {
228
261
  return true;
229
262
  }
263
+ assertJust() {
264
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
265
+ }
266
+ assertNothing() {
267
+ return this;
268
+ }
230
269
  getJustOrNull() {
231
270
  return null;
232
271
  }
272
+ match(_onJust, onNothing) {
273
+ return onNothing();
274
+ }
233
275
  };
234
276
 
235
277
  // src/func/seq.ts
@@ -1,4 +1,4 @@
1
- export { Task, TaskDo, TaskDoType } from './data/task.cjs';
1
+ export { Task, TaskDo, TaskDoType, TaskDoTypeBase, TaskDoTypeGet, TaskDoTypeIf, TaskDoTypeIfReturn, TaskDoTypeNoGet, TaskDoTypeReturn } from './data/task.cjs';
2
2
  export { Just, Maybe, Nothing } from './data/maybe.cjs';
3
3
  export { Either, Left, Right } from './data/either.cjs';
4
4
  export { seqArrayEither, seqArrayTask, seqEitherArray, seqEitherTask } from './func/seq.cjs';
@@ -9,9 +9,6 @@ var Just = class _Just extends Maybe {
9
9
  super();
10
10
  this.\u503C = \u503C;
11
11
  }
12
- match(onJust, _onNothing) {
13
- return onJust(this.\u503C);
14
- }
15
12
  map(f) {
16
13
  return new _Just(f(this.\u503C));
17
14
  }
@@ -24,17 +21,23 @@ var Just = class _Just extends Maybe {
24
21
  isNothing() {
25
22
  return false;
26
23
  }
24
+ assertJust() {
25
+ return this;
26
+ }
27
+ assertNothing() {
28
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
29
+ }
27
30
  getJust() {
28
31
  return this.\u503C;
29
32
  }
30
33
  getJustOrNull() {
31
34
  return this.\u503C;
32
35
  }
36
+ match(onJust, _onNothing) {
37
+ return onJust(this.\u503C);
38
+ }
33
39
  };
34
40
  var Nothing = class _Nothing extends Maybe {
35
- match(_onJust, onNothing) {
36
- return onNothing();
37
- }
38
41
  map(_f) {
39
42
  return new _Nothing();
40
43
  }
@@ -47,9 +50,18 @@ var Nothing = class _Nothing extends Maybe {
47
50
  isNothing() {
48
51
  return true;
49
52
  }
53
+ assertJust() {
54
+ throw new Error("\u65AD\u8A00\u5931\u8D25");
55
+ }
56
+ assertNothing() {
57
+ return this;
58
+ }
50
59
  getJustOrNull() {
51
60
  return null;
52
61
  }
62
+ match(_onJust, onNothing) {
63
+ return onNothing();
64
+ }
53
65
  };
54
66
 
55
67
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Task
3
- } from "./chunk-ZUDRGXSS.js";
3
+ } from "./chunk-OYLE35IQ.js";
4
4
  import {
5
5
  Left,
6
6
  Right
@@ -11,25 +11,52 @@ var TaskDo = class _TaskDo {
11
11
  let(name, task) {
12
12
  return new _TaskDo(
13
13
  this.accTask.bind(
14
- (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v }))
14
+ (a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
15
15
  )
16
16
  );
17
17
  }
18
18
  bind(name, task) {
19
19
  return new _TaskDo(
20
- this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: v })))
20
+ this.accTask.bind(
21
+ (a) => task(a.env).bind((v) => Task.pure({ env: { ...a.env, [name]: v }, lastValue: a.lastValue }))
22
+ )
21
23
  );
22
24
  }
23
25
  exec(task) {
24
- return new _TaskDo(this.accTask.bind((a) => task(a.env).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
26
+ return new _TaskDo(
27
+ this.accTask.bind((a) => task(a.env).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
28
+ );
25
29
  }
26
30
  effect(task) {
31
+ return new _TaskDo(
32
+ this.accTask.bind((a) => Task.pure(task(a.env)).bind(() => Task.pure({ env: a.env, lastValue: a.lastValue })))
33
+ );
34
+ }
35
+ pure(task) {
27
36
  return new _TaskDo(
28
37
  this.accTask.bind((a) => Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v })))
29
38
  );
30
39
  }
31
- pure(value) {
32
- return new _TaskDo(this.accTask.bind((a) => Task.pure(value).bind((v) => Task.pure({ env: a.env, lastValue: v }))));
40
+ if(cond, task) {
41
+ return new _TaskDo(
42
+ this.accTask.bind(
43
+ (a) => Task.pure(cond(a.env)).bind(
44
+ (c) => c ? Task.pure(task(a.env)).bind((x) => Task.pure({ env: a.env, lastValue: x, lock: true })) : Task.pure({
45
+ env: a.env,
46
+ /*从类型可以确保if没命中的情况pureIf来补充正确的候选值, 所以这里跳过ts检查*/
47
+ lastValue: a.lastValue,
48
+ lock: false
49
+ })
50
+ )
51
+ )
52
+ );
53
+ }
54
+ pureR(task) {
55
+ return new _TaskDo(
56
+ this.accTask.bind(
57
+ (a) => a.lock ? Task.pure(a) : Task.pure(task(a.env)).bind((v) => Task.pure({ env: a.env, lastValue: v }))
58
+ )
59
+ );
33
60
  }
34
61
  getTask() {
35
62
  return new Task(async () => {
@@ -56,6 +83,9 @@ var Task = class _Task {
56
83
  run() {
57
84
  return this.f();
58
85
  }
86
+ do() {
87
+ return new TaskDo(this.bind((a) => _Task.pure({ env: {}, lastValue: a })));
88
+ }
59
89
  async tryRun() {
60
90
  try {
61
91
  return new Right(await this.run());
@@ -4,27 +4,33 @@ declare abstract class Maybe<A> {
4
4
  abstract bind<B>(f: (a: A) => Maybe<B>): Maybe<B>;
5
5
  abstract isJust(): this is Just<A>;
6
6
  abstract isNothing(): this is Nothing<A>;
7
+ abstract assertJust(): Just<A>;
8
+ abstract assertNothing(): Nothing<A>;
7
9
  abstract getJustOrNull(): A | null;
8
10
  abstract match<B>(onJust: (a: A) => B, onNothing: () => B): B;
9
11
  }
10
12
  declare class Just<A> extends Maybe<A> {
11
13
  private 值;
12
14
  constructor(值: A);
13
- match<B>(onJust: (a: A) => B, _onNothing: () => B): B;
14
15
  map<B>(f: (a: A) => B): Maybe<B>;
15
16
  bind<B>(f: (a: A) => Maybe<B>): Maybe<B>;
16
17
  isJust(): this is Just<A>;
17
18
  isNothing(): this is Nothing<A>;
19
+ assertJust(): Just<A>;
20
+ assertNothing(): Nothing<A>;
18
21
  getJust(): A;
19
22
  getJustOrNull(): A | null;
23
+ match<B>(onJust: (a: A) => B, _onNothing: () => B): B;
20
24
  }
21
25
  declare class Nothing<A> extends Maybe<A> {
22
- match<B>(_onJust: (a: A) => B, onNothing: () => B): B;
23
26
  map<B>(_f: (a: A) => B): Maybe<B>;
24
27
  bind<B>(_f: (a: A) => Maybe<B>): Maybe<B>;
25
28
  isJust(): this is Just<A>;
26
29
  isNothing(): this is Nothing<A>;
30
+ assertJust(): Just<A>;
31
+ assertNothing(): Nothing<A>;
27
32
  getJustOrNull(): A | null;
33
+ match<B>(_onJust: (a: A) => B, onNothing: () => B): B;
28
34
  }
29
35
 
30
36
  export { Just, Maybe, Nothing };
@@ -2,7 +2,7 @@ import {
2
2
  Just,
3
3
  Maybe,
4
4
  Nothing
5
- } from "../chunk-PP7TCBHD.js";
5
+ } from "../chunk-CQG32QQC.js";
6
6
  export {
7
7
  Just,
8
8
  Maybe,
@@ -1,35 +1,51 @@
1
1
  import { Either } from './either.js';
2
2
 
3
- interface TaskDoType<Env extends Record<string, any>, A> {
4
- let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoType<Env & Record<K, X>, X>;
5
- bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoType<Env & Record<K, X>, X>;
6
- exec<X>(task: (env: Env) => Task<X>): TaskDoType<Env, X>;
7
- effect<X>(task: (env: Env) => X): TaskDoType<Env, X>;
8
- pure<X>(value: X): TaskDoType<Env, X>;
3
+ type TaskDoTypeBase<Env extends Record<string, any>, A> = {
4
+ let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoTypeNoGet<Env & Record<K, X>, A>;
5
+ bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env & Record<K, X>, A>;
6
+ exec<X>(task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env, A>;
7
+ effect<X>(task: (env: Env) => X): TaskDoTypeNoGet<Env, A>;
8
+ };
9
+ type TaskDoTypeReturn<Env extends Record<string, any>, _A> = {
10
+ pure<X>(task: (env: Env) => X): TaskDoTypeGet<Env, X>;
11
+ };
12
+ type TaskDoTypeIf<Env extends Record<string, any>, _A> = {
13
+ if<X>(cond: (env: Env) => boolean, task: (env: Env) => X): TaskDoTypeIfReturn<Env, X>;
14
+ };
15
+ type TaskDoTypeIfReturn<Env extends Record<string, any>, A> = {
16
+ pureR(task: (env: Env) => A): TaskDoTypeGet<Env, A>;
17
+ };
18
+ type TaskDoTypeGet<_Env extends Record<string, any>, A> = {
9
19
  getTask(): Task<A>;
10
- }
20
+ };
21
+ type TaskDoTypeNoGet<Env extends Record<string, any>, A> = TaskDoTypeBase<Env, A> & TaskDoTypeReturn<Env, A> & TaskDoTypeIf<Env, A>;
22
+ type TaskDoType<Env extends Record<string, any>, A> = TaskDoTypeBase<Env, A> & TaskDoTypeReturn<Env, A> & TaskDoTypeGet<Env, A> & TaskDoTypeIf<Env, A> & TaskDoTypeIfReturn<Env, A>;
11
23
  declare class TaskDo<Env extends Record<string, any>, A> implements TaskDoType<Env, A> {
12
24
  private accTask;
13
25
  constructor(accTask: Task<{
14
26
  env: Env;
15
27
  lastValue: A;
28
+ lock?: boolean;
16
29
  }>);
17
- let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoType<Env & Record<K, X>, X>;
18
- bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoType<Env & Record<K, X>, X>;
19
- exec<X>(task: (env: Env) => Task<X>): TaskDoType<Env, X>;
20
- effect<X>(task: (env: Env) => X): TaskDoType<Env, X>;
21
- pure<X>(value: X): TaskDoType<Env, X>;
30
+ let<K extends string, X>(name: K, task: (env: Env) => X): TaskDoTypeNoGet<Env & Record<K, X>, A>;
31
+ bind<K extends string, X>(name: K, task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env & Record<K, X>, A>;
32
+ exec<X>(task: (env: Env) => Task<X>): TaskDoTypeNoGet<Env, A>;
33
+ effect<X>(task: (env: Env) => X): TaskDoTypeNoGet<Env, A>;
34
+ pure<X>(task: (env: Env) => X): TaskDoTypeGet<Env, X>;
35
+ if<X>(cond: (env: Env) => boolean, task: (env: Env) => X): TaskDoTypeIfReturn<Env, X>;
36
+ pureR(task: (env: Env) => A): TaskDoTypeGet<Env, A>;
22
37
  getTask(): Task<A>;
23
38
  }
24
39
  declare class Task<A> {
25
40
  private f;
26
41
  static pure<A>(a: A): Task<A>;
27
- static do(): TaskDo<Record<string, any>, void>;
42
+ static do(): TaskDoTypeBase<Record<string, any>, void>;
28
43
  constructor(f: () => Promise<A>);
29
44
  map<B>(f: (a: A) => B): Task<B>;
30
45
  bind<B>(f: (a: A) => Task<B>): Task<B>;
31
46
  run(): Promise<A>;
47
+ do(): TaskDoTypeBase<{}, A>;
32
48
  tryRun(): Promise<Either<Error, A>>;
33
49
  }
34
50
 
35
- export { Task, TaskDo, type TaskDoType };
51
+ export { Task, TaskDo, type TaskDoType, type TaskDoTypeBase, type TaskDoTypeGet, type TaskDoTypeIf, type TaskDoTypeIfReturn, type TaskDoTypeNoGet, type TaskDoTypeReturn };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Task,
3
3
  TaskDo
4
- } from "../chunk-ZUDRGXSS.js";
4
+ } from "../chunk-OYLE35IQ.js";
5
5
  import "../chunk-VTI5CRVQ.js";
6
6
  export {
7
7
  Task,
@@ -3,8 +3,8 @@ import {
3
3
  seqArrayTask,
4
4
  seqEitherArray,
5
5
  seqEitherTask
6
- } from "../chunk-YEO4J4FS.js";
7
- import "../chunk-ZUDRGXSS.js";
6
+ } from "../chunk-IHXXIFRN.js";
7
+ import "../chunk-OYLE35IQ.js";
8
8
  import "../chunk-VTI5CRVQ.js";
9
9
  export {
10
10
  seqArrayEither,
@@ -1,4 +1,4 @@
1
- export { Task, TaskDo, TaskDoType } from './data/task.js';
1
+ export { Task, TaskDo, TaskDoType, TaskDoTypeBase, TaskDoTypeGet, TaskDoTypeIf, TaskDoTypeIfReturn, TaskDoTypeNoGet, TaskDoTypeReturn } from './data/task.js';
2
2
  export { Just, Maybe, Nothing } from './data/maybe.js';
3
3
  export { Either, Left, Right } from './data/either.js';
4
4
  export { seqArrayEither, seqArrayTask, seqEitherArray, seqEitherTask } from './func/seq.js';
package/dist/esm/index.js CHANGED
@@ -2,17 +2,17 @@ import {
2
2
  Just,
3
3
  Maybe,
4
4
  Nothing
5
- } from "./chunk-PP7TCBHD.js";
5
+ } from "./chunk-CQG32QQC.js";
6
6
  import {
7
7
  seqArrayEither,
8
8
  seqArrayTask,
9
9
  seqEitherArray,
10
10
  seqEitherTask
11
- } from "./chunk-YEO4J4FS.js";
11
+ } from "./chunk-IHXXIFRN.js";
12
12
  import {
13
13
  Task,
14
14
  TaskDo
15
- } from "./chunk-ZUDRGXSS.js";
15
+ } from "./chunk-OYLE35IQ.js";
16
16
  import {
17
17
  Either,
18
18
  Left,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lsby/ts-fp-data",
3
- "version": "0.0.9-beta.2",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "require": "./dist/cjs/index.cjs",
@@ -9,22 +9,24 @@
9
9
  "files": [
10
10
  "dist"
11
11
  ],
12
- "dependencies": {},
13
12
  "devDependencies": {
14
13
  "@ianvs/prettier-plugin-sort-imports": "^4.2.1",
15
14
  "@types/node": "^20.12.10",
16
15
  "@typescript-eslint/eslint-plugin": "^7.8.0",
17
16
  "@typescript-eslint/parser": "^7.8.0",
17
+ "@vitest/coverage-v8": "^2.0.2",
18
18
  "bumpp": "^9.4.1",
19
19
  "eslint": "^8.56.0",
20
20
  "eslint-config-prettier": "^9.1.0",
21
21
  "eslint-plugin-sort-class-members": "^1.20.0",
22
22
  "eslint-plugin-unused-imports": "^3.2.0",
23
+ "open-cli": "^8.0.0",
23
24
  "prettier": "3.2.5",
24
25
  "prettier-plugin-packagejson": "^2.5.0",
25
26
  "tsup": "^8.0.2",
26
27
  "tsx": "^4.9.3",
27
- "typescript": "^5.4.5"
28
+ "typescript": "^5.4.5",
29
+ "vitest": "^2.0.2"
28
30
  },
29
31
  "scripts": {
30
32
  "build:all": "npm run build:cjs && npm run build:esm",
@@ -37,6 +39,7 @@
37
39
  "other:typecheck": "tsc --noEmit",
38
40
  "other:typecheck:watch": "tsc --noEmit -w",
39
41
  "run:start": "tsx src/index.ts",
40
- "run:test": "tsx test/index.ts"
42
+ "test:base": "vitest run",
43
+ "test:coverage": "vitest run --coverage && open-cli ./coverage/index.html"
41
44
  }
42
45
  }