fp-pack 0.3.0 → 0.5.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.
Files changed (38) hide show
  1. package/README.md +119 -32
  2. package/dist/fp-pack.umd.js +1 -1
  3. package/dist/fp-pack.umd.js.map +1 -1
  4. package/dist/implement/async/pipeAsync.d.ts +7 -0
  5. package/dist/implement/async/pipeAsync.d.ts.map +1 -1
  6. package/dist/implement/async/pipeAsync.mjs.map +1 -1
  7. package/dist/implement/async/pipeAsyncSideEffect.d.ts +7 -0
  8. package/dist/implement/async/pipeAsyncSideEffect.d.ts.map +1 -1
  9. package/dist/implement/async/pipeAsyncSideEffect.mjs.map +1 -1
  10. package/dist/implement/async/pipeAsyncSideEffectStrict.d.ts +90 -0
  11. package/dist/implement/async/pipeAsyncSideEffectStrict.d.ts.map +1 -1
  12. package/dist/implement/async/pipeAsyncSideEffectStrict.mjs.map +1 -1
  13. package/dist/implement/composition/from.d.ts +5 -1
  14. package/dist/implement/composition/from.d.ts.map +1 -1
  15. package/dist/implement/composition/from.mjs +4 -3
  16. package/dist/implement/composition/from.mjs.map +1 -1
  17. package/dist/implement/composition/pipe.d.ts +8 -0
  18. package/dist/implement/composition/pipe.d.ts.map +1 -1
  19. package/dist/implement/composition/pipe.mjs.map +1 -1
  20. package/dist/implement/composition/pipe.type-test.d.ts +98 -0
  21. package/dist/implement/composition/pipe.type-test.d.ts.map +1 -1
  22. package/dist/implement/composition/pipeSideEffect.d.ts +11 -0
  23. package/dist/implement/composition/pipeSideEffect.d.ts.map +1 -1
  24. package/dist/implement/composition/pipeSideEffect.mjs.map +1 -1
  25. package/dist/implement/composition/pipeSideEffectStrict.d.ts +90 -0
  26. package/dist/implement/composition/pipeSideEffectStrict.d.ts.map +1 -1
  27. package/dist/implement/composition/pipeSideEffectStrict.mjs.map +1 -1
  28. package/dist/skills/fp-pack/SKILL.md +14 -6
  29. package/dist/skills/fp-pack.md +14 -6
  30. package/package.json +3 -2
  31. package/src/implement/async/pipeAsync.ts +48 -0
  32. package/src/implement/async/pipeAsyncSideEffect.ts +49 -0
  33. package/src/implement/async/pipeAsyncSideEffectStrict.ts +170 -0
  34. package/src/implement/composition/from.ts +9 -2
  35. package/src/implement/composition/pipe.ts +84 -0
  36. package/src/implement/composition/pipe.type-test.ts +299 -0
  37. package/src/implement/composition/pipeSideEffect.ts +89 -0
  38. package/src/implement/composition/pipeSideEffectStrict.ts +170 -0
@@ -1,6 +1,6 @@
1
1
  # fp-pack AI Agent Skills
2
2
 
3
- Document Version: 0.3.0
3
+ Document Version: 0.5.0
4
4
 
5
5
  This document provides guidelines for AI coding assistants when working in projects that use fp-pack. Follow these instructions to write clean, declarative, functional code using fp-pack's utilities.
6
6
 
@@ -519,13 +519,13 @@ const gradeToLetter = cond([
519
519
  ### 6.1 Type-Safety Tips (prop/ifElse/cond)
520
520
 
521
521
  - `prop` returns `T[K] | undefined`. Use `propOr` (or guard) before array operations.
522
- - `ifElse` expects **functions** for both branches. If you already have a value, wrap it: `() => value`.
523
- - Use `from(value)` when you need a unary function that ignores input (handy for `ifElse` branches).
522
+ - `ifElse` expects **functions** for both branches. If you already have a value, wrap it: `() => value` or use `from(value)` for cleaner constant branches.
523
+ - Use `from(value)` when you need a unary function that ignores input (handy for `ifElse`/`cond` branches and data-first patterns).
524
524
  - `cond` returns `R | undefined`. Add a default branch and coalesce when you need a strict result.
525
525
  - In `pipeSideEffect`, keep step return types aligned to avoid wide unions.
526
526
 
527
527
  ```typescript
528
- import { pipe, propOr, append, assoc, ifElse, cond, from } from 'fp-pack';
528
+ import { pipe, propOr, append, assoc, ifElse, cond, from, filter, map } from 'fp-pack';
529
529
 
530
530
  // propOr keeps the type strict for array ops
531
531
  const addTodo = (text: string, state: AppState) =>
@@ -542,13 +542,21 @@ const toggleTodo = (id: string) => ifElse(
542
542
  (todo) => todo
543
543
  );
544
544
 
545
- // from is useful for constant branches
545
+ // from is useful for constant branches - cleaner than () => value
546
546
  const statusLabel = ifElse(
547
547
  (score: number) => score >= 60,
548
- from('pass'),
548
+ from('pass'), // Constant value
549
549
  from('fail')
550
550
  );
551
551
 
552
+ // Data-first pattern with from: inject data into pipeline
553
+ const processData = pipe(
554
+ from([1, 2, 3, 4, 5]),
555
+ filter((n: number) => n % 2 === 0),
556
+ map(n => n * 2)
557
+ );
558
+ const result = processData(); // [4, 8]
559
+
552
560
  // cond still returns R | undefined, so coalesce if needed
553
561
  const grade = (score: number) =>
554
562
  cond([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fp-pack",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "description": "Functional programming utilities library for TypeScript",
6
6
  "keywords": [
@@ -73,7 +73,8 @@
73
73
  "preview": "vite preview",
74
74
  "test": "vitest",
75
75
  "test:ui": "vitest --ui",
76
- "test:run": "vitest run",
76
+ "test:run": "pnpm test:types && vitest run",
77
+ "test:types": "tsc --noEmit",
77
78
  "clean": "pnpm clean:dist && pnpm clean:module",
78
79
  "clean:dist": "rm -rf dist docs/dist",
79
80
  "clean:module": "rm -rf dist docs/dist node_modules",
@@ -1,3 +1,5 @@
1
+ import type { FromFn } from '../composition/from';
2
+
1
3
  /** pipeAsync - 비동기 함수 합성 */
2
4
  type AsyncOrSync<A, R> = (a: A) => R | Promise<R>;
3
5
  type PipeInput<Fns extends AsyncOrSync<any, any>[]> = Fns extends [AsyncOrSync<infer A, any>, ...AsyncOrSync<any, any>[]]
@@ -11,7 +13,11 @@ type PipeOutput<Fns extends AsyncOrSync<any, any>[]> = Fns extends [AsyncOrSync<
11
13
  : never
12
14
  : never;
13
15
  type PipeAsync<Fns extends AsyncOrSync<any, any>[]> = (input: PipeInput<Fns>) => Promise<PipeOutput<Fns>>;
16
+ type PipeAsyncFrom<Fns extends [FromFn<any>, ...AsyncOrSync<any, any>[]]> = (
17
+ input?: PipeInput<Fns>
18
+ ) => Promise<PipeOutput<Fns>>;
14
19
 
20
+ function pipeAsync<Fns extends [FromFn<any>, ...AsyncOrSync<any, any>[]]>(...funcs: Fns): PipeAsyncFrom<Fns>;
15
21
  function pipeAsync<A, R>(ab: AsyncOrSync<A, R>): (a: A) => Promise<Awaited<R>>;
16
22
  function pipeAsync<A, B, R>(ab: AsyncOrSync<A, B>, bc: AsyncOrSync<Awaited<B>, R>): (a: A) => Promise<Awaited<R>>;
17
23
  function pipeAsync<A, B, C, R>(
@@ -40,6 +46,48 @@ function pipeAsync<A, B, C, D, E, F, R>(
40
46
  ef: AsyncOrSync<Awaited<E>, F>,
41
47
  fg: AsyncOrSync<Awaited<F>, R>
42
48
  ): (a: A) => Promise<Awaited<R>>;
49
+ function pipeAsync<A, B, C, D, E, F, G, R>(
50
+ ab: AsyncOrSync<A, B>,
51
+ bc: AsyncOrSync<Awaited<B>, C>,
52
+ cd: AsyncOrSync<Awaited<C>, D>,
53
+ de: AsyncOrSync<Awaited<D>, E>,
54
+ ef: AsyncOrSync<Awaited<E>, F>,
55
+ fg: AsyncOrSync<Awaited<F>, G>,
56
+ gh: AsyncOrSync<Awaited<G>, R>
57
+ ): (a: A) => Promise<Awaited<R>>;
58
+ function pipeAsync<A, B, C, D, E, F, G, H, R>(
59
+ ab: AsyncOrSync<A, B>,
60
+ bc: AsyncOrSync<Awaited<B>, C>,
61
+ cd: AsyncOrSync<Awaited<C>, D>,
62
+ de: AsyncOrSync<Awaited<D>, E>,
63
+ ef: AsyncOrSync<Awaited<E>, F>,
64
+ fg: AsyncOrSync<Awaited<F>, G>,
65
+ gh: AsyncOrSync<Awaited<G>, H>,
66
+ hi: AsyncOrSync<Awaited<H>, R>
67
+ ): (a: A) => Promise<Awaited<R>>;
68
+ function pipeAsync<A, B, C, D, E, F, G, H, I, R>(
69
+ ab: AsyncOrSync<A, B>,
70
+ bc: AsyncOrSync<Awaited<B>, C>,
71
+ cd: AsyncOrSync<Awaited<C>, D>,
72
+ de: AsyncOrSync<Awaited<D>, E>,
73
+ ef: AsyncOrSync<Awaited<E>, F>,
74
+ fg: AsyncOrSync<Awaited<F>, G>,
75
+ gh: AsyncOrSync<Awaited<G>, H>,
76
+ hi: AsyncOrSync<Awaited<H>, I>,
77
+ ij: AsyncOrSync<Awaited<I>, R>
78
+ ): (a: A) => Promise<Awaited<R>>;
79
+ function pipeAsync<A, B, C, D, E, F, G, H, I, J, R>(
80
+ ab: AsyncOrSync<A, B>,
81
+ bc: AsyncOrSync<Awaited<B>, C>,
82
+ cd: AsyncOrSync<Awaited<C>, D>,
83
+ de: AsyncOrSync<Awaited<D>, E>,
84
+ ef: AsyncOrSync<Awaited<E>, F>,
85
+ fg: AsyncOrSync<Awaited<F>, G>,
86
+ gh: AsyncOrSync<Awaited<G>, H>,
87
+ hi: AsyncOrSync<Awaited<H>, I>,
88
+ ij: AsyncOrSync<Awaited<I>, J>,
89
+ jk: AsyncOrSync<Awaited<J>, R>
90
+ ): (a: A) => Promise<Awaited<R>>;
43
91
 
44
92
  function pipeAsync<Fns extends [AsyncOrSync<any, any>, ...AsyncOrSync<any, any>[]]>(...funcs: Fns): PipeAsync<Fns>;
45
93
  function pipeAsync(...funcs: Array<AsyncOrSync<any, any>>): (value: any) => Promise<any>;
@@ -1,3 +1,4 @@
1
+ import type { FromFn } from '../composition/from';
1
2
  import SideEffect, { isSideEffect } from '../composition/sideEffect';
2
3
 
3
4
  /** pipeAsyncSideEffect - SideEffect를 허용하는 비동기 함수 합성 */
@@ -21,7 +22,13 @@ type Resolve<T> = T extends infer R ? R : never;
21
22
  type PipeAsyncSideEffect<Fns extends AsyncOrSync<any, any>[]> = (
22
23
  input: PipeInput<Fns> | SideEffect<any>
23
24
  ) => Promise<Resolve<PipeOutput<Fns>>>;
25
+ type PipeAsyncSideEffectFrom<Fns extends [FromFn<any>, ...AsyncOrSync<any, any>[]]> = (
26
+ input?: PipeInput<Fns> | SideEffect<any>
27
+ ) => Promise<Resolve<PipeOutput<Fns>>>;
24
28
 
29
+ function pipeAsyncSideEffect<Fns extends [FromFn<any>, ...AsyncOrSync<any, any>[]]>(
30
+ ...funcs: Fns
31
+ ): PipeAsyncSideEffectFrom<Fns>;
25
32
  function pipeAsyncSideEffect<A, R>(
26
33
  ab: AsyncOrSync<A, R>
27
34
  ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
@@ -55,6 +62,48 @@ function pipeAsyncSideEffect<A, B, C, D, E, F, R>(
55
62
  ef: AsyncOrSync<Awaited<E>, F>,
56
63
  fg: AsyncOrSync<Awaited<F>, R>
57
64
  ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
65
+ function pipeAsyncSideEffect<A, B, C, D, E, F, G, R>(
66
+ ab: AsyncOrSync<A, B>,
67
+ bc: AsyncOrSync<Awaited<B>, C>,
68
+ cd: AsyncOrSync<Awaited<C>, D>,
69
+ de: AsyncOrSync<Awaited<D>, E>,
70
+ ef: AsyncOrSync<Awaited<E>, F>,
71
+ fg: AsyncOrSync<Awaited<F>, G>,
72
+ gh: AsyncOrSync<Awaited<G>, R>
73
+ ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
74
+ function pipeAsyncSideEffect<A, B, C, D, E, F, G, H, R>(
75
+ ab: AsyncOrSync<A, B>,
76
+ bc: AsyncOrSync<Awaited<B>, C>,
77
+ cd: AsyncOrSync<Awaited<C>, D>,
78
+ de: AsyncOrSync<Awaited<D>, E>,
79
+ ef: AsyncOrSync<Awaited<E>, F>,
80
+ fg: AsyncOrSync<Awaited<F>, G>,
81
+ gh: AsyncOrSync<Awaited<G>, H>,
82
+ hi: AsyncOrSync<Awaited<H>, R>
83
+ ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
84
+ function pipeAsyncSideEffect<A, B, C, D, E, F, G, H, I, R>(
85
+ ab: AsyncOrSync<A, B>,
86
+ bc: AsyncOrSync<Awaited<B>, C>,
87
+ cd: AsyncOrSync<Awaited<C>, D>,
88
+ de: AsyncOrSync<Awaited<D>, E>,
89
+ ef: AsyncOrSync<Awaited<E>, F>,
90
+ fg: AsyncOrSync<Awaited<F>, G>,
91
+ gh: AsyncOrSync<Awaited<G>, H>,
92
+ hi: AsyncOrSync<Awaited<H>, I>,
93
+ ij: AsyncOrSync<Awaited<I>, R>
94
+ ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
95
+ function pipeAsyncSideEffect<A, B, C, D, E, F, G, H, I, J, R>(
96
+ ab: AsyncOrSync<A, B>,
97
+ bc: AsyncOrSync<Awaited<B>, C>,
98
+ cd: AsyncOrSync<Awaited<C>, D>,
99
+ de: AsyncOrSync<Awaited<D>, E>,
100
+ ef: AsyncOrSync<Awaited<E>, F>,
101
+ fg: AsyncOrSync<Awaited<F>, G>,
102
+ gh: AsyncOrSync<Awaited<G>, H>,
103
+ hi: AsyncOrSync<Awaited<H>, I>,
104
+ ij: AsyncOrSync<Awaited<I>, J>,
105
+ jk: AsyncOrSync<Awaited<J>, R>
106
+ ): (a: A | SideEffect<any>) => Promise<MaybeSideEffect<Awaited<R>>>;
58
107
 
59
108
  function pipeAsyncSideEffect<Fns extends [AsyncOrSync<any, any>, ...AsyncOrSync<any, any>[]]>(
60
109
  ...funcs: Fns
@@ -1,3 +1,4 @@
1
+ import type { FromFn } from '../composition/from';
1
2
  import SideEffect, { isSideEffect } from '../composition/sideEffect';
2
3
 
3
4
  type AnyFn = (...args: any[]) => any;
@@ -43,6 +44,12 @@ type PipeAsyncSideEffectStrictUnary<Fns extends [AnyFn, ...AnyFn[]]> = {
43
44
  input: PipeInputStrict<Fns> | SideEffect<EIn>
44
45
  ): Promise<Resolve<MaybeSideEffect<PipeValueOutputStrict<Fns>, EffectsOf<Fns> | EIn>>>;
45
46
  };
47
+ type PipeAsyncSideEffectStrictUnaryOptional<Fns extends [AnyFn, ...AnyFn[]]> = {
48
+ (input?: PipeInputStrict<Fns>): Promise<Resolve<MaybeSideEffect<PipeValueOutputStrict<Fns>, EffectsOf<Fns>>>>;
49
+ <EIn>(
50
+ input?: PipeInputStrict<Fns> | SideEffect<EIn>
51
+ ): Promise<Resolve<MaybeSideEffect<PipeValueOutputStrict<Fns>, EffectsOf<Fns> | EIn>>>;
52
+ };
46
53
 
47
54
  type PipeAsyncSideEffectStrict<Fns extends [AnyFn, ...AnyFn[]]> = Fns extends [ZeroFn<any>, ...AnyFn[]]
48
55
  ? () => Promise<Resolve<MaybeSideEffect<PipeValueOutputStrict<Fns>, EffectsOf<Fns>>>>
@@ -97,6 +104,89 @@ function pipeAsyncSideEffectStrict<B, C, D, E, F, R>(
97
104
  AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
98
105
  AsyncOrSync<NonSideEffect<Awaited<F>>, R>
99
106
  ]>;
107
+ function pipeAsyncSideEffectStrict<B, C, D, E, F, G, R>(
108
+ ab: ZeroFn<B>,
109
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
110
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
111
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
112
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
113
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
114
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, R>
115
+ ): PipeAsyncSideEffectStrict<[
116
+ ZeroFn<B>,
117
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
118
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
119
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
120
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
121
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
122
+ AsyncOrSync<NonSideEffect<Awaited<G>>, R>
123
+ ]>;
124
+ function pipeAsyncSideEffectStrict<B, C, D, E, F, G, H, R>(
125
+ ab: ZeroFn<B>,
126
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
127
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
128
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
129
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
130
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
131
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
132
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, R>
133
+ ): PipeAsyncSideEffectStrict<[
134
+ ZeroFn<B>,
135
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
136
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
137
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
138
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
139
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
140
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
141
+ AsyncOrSync<NonSideEffect<Awaited<H>>, R>
142
+ ]>;
143
+ function pipeAsyncSideEffectStrict<B, C, D, E, F, G, H, I, R>(
144
+ ab: ZeroFn<B>,
145
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
146
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
147
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
148
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
149
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
150
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
151
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
152
+ ij: AsyncOrSync<NonSideEffect<Awaited<I>>, R>
153
+ ): PipeAsyncSideEffectStrict<[
154
+ ZeroFn<B>,
155
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
156
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
157
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
158
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
159
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
160
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
161
+ AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
162
+ AsyncOrSync<NonSideEffect<Awaited<I>>, R>
163
+ ]>;
164
+ function pipeAsyncSideEffectStrict<B, C, D, E, F, G, H, I, J, R>(
165
+ ab: ZeroFn<B>,
166
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
167
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
168
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
169
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
170
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
171
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
172
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
173
+ ij: AsyncOrSync<NonSideEffect<Awaited<I>>, J>,
174
+ jk: AsyncOrSync<NonSideEffect<Awaited<J>>, R>
175
+ ): PipeAsyncSideEffectStrict<[
176
+ ZeroFn<B>,
177
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
178
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
179
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
180
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
181
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
182
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
183
+ AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
184
+ AsyncOrSync<NonSideEffect<Awaited<I>>, J>,
185
+ AsyncOrSync<NonSideEffect<Awaited<J>>, R>
186
+ ]>;
187
+ function pipeAsyncSideEffectStrict<Fns extends [FromFn<any>, ...AnyFn[]]>(
188
+ ...funcs: Fns
189
+ ): PipeAsyncSideEffectStrictUnaryOptional<Fns>;
100
190
  function pipeAsyncSideEffectStrict<A, R>(
101
191
  ab: AsyncOrSync<A, R>
102
192
  ): PipeAsyncSideEffectStrict<[AsyncOrSync<A, R>]>;
@@ -152,6 +242,86 @@ function pipeAsyncSideEffectStrict<A, B, C, D, E, F, R>(
152
242
  AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
153
243
  AsyncOrSync<NonSideEffect<Awaited<F>>, R>
154
244
  ]>;
245
+ function pipeAsyncSideEffectStrict<A, B, C, D, E, F, G, R>(
246
+ ab: AsyncOrSync<A, B>,
247
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
248
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
249
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
250
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
251
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
252
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, R>
253
+ ): PipeAsyncSideEffectStrict<[
254
+ AsyncOrSync<A, B>,
255
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
256
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
257
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
258
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
259
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
260
+ AsyncOrSync<NonSideEffect<Awaited<G>>, R>
261
+ ]>;
262
+ function pipeAsyncSideEffectStrict<A, B, C, D, E, F, G, H, R>(
263
+ ab: AsyncOrSync<A, B>,
264
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
265
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
266
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
267
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
268
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
269
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
270
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, R>
271
+ ): PipeAsyncSideEffectStrict<[
272
+ AsyncOrSync<A, B>,
273
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
274
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
275
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
276
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
277
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
278
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
279
+ AsyncOrSync<NonSideEffect<Awaited<H>>, R>
280
+ ]>;
281
+ function pipeAsyncSideEffectStrict<A, B, C, D, E, F, G, H, I, R>(
282
+ ab: AsyncOrSync<A, B>,
283
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
284
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
285
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
286
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
287
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
288
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
289
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
290
+ ij: AsyncOrSync<NonSideEffect<Awaited<I>>, R>
291
+ ): PipeAsyncSideEffectStrict<[
292
+ AsyncOrSync<A, B>,
293
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
294
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
295
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
296
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
297
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
298
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
299
+ AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
300
+ AsyncOrSync<NonSideEffect<Awaited<I>>, R>
301
+ ]>;
302
+ function pipeAsyncSideEffectStrict<A, B, C, D, E, F, G, H, I, J, R>(
303
+ ab: AsyncOrSync<A, B>,
304
+ bc: AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
305
+ cd: AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
306
+ de: AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
307
+ ef: AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
308
+ fg: AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
309
+ gh: AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
310
+ hi: AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
311
+ ij: AsyncOrSync<NonSideEffect<Awaited<I>>, J>,
312
+ jk: AsyncOrSync<NonSideEffect<Awaited<J>>, R>
313
+ ): PipeAsyncSideEffectStrict<[
314
+ AsyncOrSync<A, B>,
315
+ AsyncOrSync<NonSideEffect<Awaited<B>>, C>,
316
+ AsyncOrSync<NonSideEffect<Awaited<C>>, D>,
317
+ AsyncOrSync<NonSideEffect<Awaited<D>>, E>,
318
+ AsyncOrSync<NonSideEffect<Awaited<E>>, F>,
319
+ AsyncOrSync<NonSideEffect<Awaited<F>>, G>,
320
+ AsyncOrSync<NonSideEffect<Awaited<G>>, H>,
321
+ AsyncOrSync<NonSideEffect<Awaited<H>>, I>,
322
+ AsyncOrSync<NonSideEffect<Awaited<I>>, J>,
323
+ AsyncOrSync<NonSideEffect<Awaited<J>>, R>
324
+ ]>;
155
325
 
156
326
  function pipeAsyncSideEffectStrict<Fns extends [AnyFn, ...AnyFn[]]>(...funcs: Fns): PipeAsyncSideEffectStrict<Fns>;
157
327
  function pipeAsyncSideEffectStrict(...funcs: Array<AsyncOrSync<any, any>>) {
@@ -1,8 +1,15 @@
1
1
  /**
2
2
  * from - 입력을 무시하고 고정 값을 반환
3
3
  */
4
- function from<T>(value: T) {
5
- return <I>(_input: I) => value;
4
+ export type FromFn<T> = {
5
+ <I>(_input: I): T;
6
+ readonly __from: true;
7
+ };
8
+
9
+ function from<T>(value: T): FromFn<T> {
10
+ const fn = (_input: unknown) => value;
11
+ Object.defineProperty(fn, '__from', { value: true });
12
+ return fn as FromFn<T>;
6
13
  }
7
14
 
8
15
  export default from;
@@ -31,6 +31,48 @@ function pipe<B, C, D, E, F, R>(
31
31
  ef: UnaryFn<E, F>,
32
32
  fg: UnaryFn<F, R>
33
33
  ): () => R;
34
+ function pipe<B, C, D, E, F, G, R>(
35
+ ab: ZeroFn<B>,
36
+ bc: UnaryFn<B, C>,
37
+ cd: UnaryFn<C, D>,
38
+ de: UnaryFn<D, E>,
39
+ ef: UnaryFn<E, F>,
40
+ fg: UnaryFn<F, G>,
41
+ gh: UnaryFn<G, R>
42
+ ): () => R;
43
+ function pipe<B, C, D, E, F, G, H, R>(
44
+ ab: ZeroFn<B>,
45
+ bc: UnaryFn<B, C>,
46
+ cd: UnaryFn<C, D>,
47
+ de: UnaryFn<D, E>,
48
+ ef: UnaryFn<E, F>,
49
+ fg: UnaryFn<F, G>,
50
+ gh: UnaryFn<G, H>,
51
+ hi: UnaryFn<H, R>
52
+ ): () => R;
53
+ function pipe<B, C, D, E, F, G, H, I, R>(
54
+ ab: ZeroFn<B>,
55
+ bc: UnaryFn<B, C>,
56
+ cd: UnaryFn<C, D>,
57
+ de: UnaryFn<D, E>,
58
+ ef: UnaryFn<E, F>,
59
+ fg: UnaryFn<F, G>,
60
+ gh: UnaryFn<G, H>,
61
+ hi: UnaryFn<H, I>,
62
+ ij: UnaryFn<I, R>
63
+ ): () => R;
64
+ function pipe<B, C, D, E, F, G, H, I, J, R>(
65
+ ab: ZeroFn<B>,
66
+ bc: UnaryFn<B, C>,
67
+ cd: UnaryFn<C, D>,
68
+ de: UnaryFn<D, E>,
69
+ ef: UnaryFn<E, F>,
70
+ fg: UnaryFn<F, G>,
71
+ gh: UnaryFn<G, H>,
72
+ hi: UnaryFn<H, I>,
73
+ ij: UnaryFn<I, J>,
74
+ jk: UnaryFn<J, R>
75
+ ): () => R;
34
76
  function pipe<A, R>(ab: UnaryFn<A, R>): (a: A) => R;
35
77
  function pipe<A, B, R>(ab: UnaryFn<A, B>, bc: UnaryFn<B, R>): (a: A) => R;
36
78
  function pipe<A, B, C, R>(ab: UnaryFn<A, B>, bc: UnaryFn<B, C>, cd: UnaryFn<C, R>): (a: A) => R;
@@ -55,6 +97,48 @@ function pipe<A, B, C, D, E, F, R>(
55
97
  ef: UnaryFn<E, F>,
56
98
  fg: UnaryFn<F, R>
57
99
  ): (a: A) => R;
100
+ function pipe<A, B, C, D, E, F, G, R>(
101
+ ab: UnaryFn<A, B>,
102
+ bc: UnaryFn<B, C>,
103
+ cd: UnaryFn<C, D>,
104
+ de: UnaryFn<D, E>,
105
+ ef: UnaryFn<E, F>,
106
+ fg: UnaryFn<F, G>,
107
+ gh: UnaryFn<G, R>
108
+ ): (a: A) => R;
109
+ function pipe<A, B, C, D, E, F, G, H, R>(
110
+ ab: UnaryFn<A, B>,
111
+ bc: UnaryFn<B, C>,
112
+ cd: UnaryFn<C, D>,
113
+ de: UnaryFn<D, E>,
114
+ ef: UnaryFn<E, F>,
115
+ fg: UnaryFn<F, G>,
116
+ gh: UnaryFn<G, H>,
117
+ hi: UnaryFn<H, R>
118
+ ): (a: A) => R;
119
+ function pipe<A, B, C, D, E, F, G, H, I, R>(
120
+ ab: UnaryFn<A, B>,
121
+ bc: UnaryFn<B, C>,
122
+ cd: UnaryFn<C, D>,
123
+ de: UnaryFn<D, E>,
124
+ ef: UnaryFn<E, F>,
125
+ fg: UnaryFn<F, G>,
126
+ gh: UnaryFn<G, H>,
127
+ hi: UnaryFn<H, I>,
128
+ ij: UnaryFn<I, R>
129
+ ): (a: A) => R;
130
+ function pipe<A, B, C, D, E, F, G, H, I, J, R>(
131
+ ab: UnaryFn<A, B>,
132
+ bc: UnaryFn<B, C>,
133
+ cd: UnaryFn<C, D>,
134
+ de: UnaryFn<D, E>,
135
+ ef: UnaryFn<E, F>,
136
+ fg: UnaryFn<F, G>,
137
+ gh: UnaryFn<G, H>,
138
+ hi: UnaryFn<H, I>,
139
+ ij: UnaryFn<I, J>,
140
+ jk: UnaryFn<J, R>
141
+ ): (a: A) => R;
58
142
 
59
143
  function pipe<Fns extends [UnaryFn<any, any>, ...UnaryFn<any, any>[]]>(...funcs: Fns): Pipe<Fns>;
60
144
  function pipe(...funcs: Array<UnaryFn<any, any>>): (input: any) => any;