semantic-typescript 0.0.7 โ†’ 0.1.4

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.
package/readme.kr.md CHANGED
@@ -1,335 +1,427 @@
1
- # ๐Ÿ“˜ semantic-typescript
1
+ # Semantic-TypeScript ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
2
2
 
3
- TypeScript์—์„œ **์˜๋ฏธ๋ก ์  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ(Semantic Data Processing)** ๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
4
- ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ, ์‹œํ€€์Šค๋ฅผ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ •๋ ฌ, ํ•„ํ„ฐ๋ง, ๊ทธ๋ฃนํ™”, ํ†ต๊ณ„ ๋ถ„์„ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
3
+ ## ์†Œ๊ฐœ
5
4
 
6
- **์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋“  ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋“ **, **ํ†ต๊ณ„ ๋ถ„์„์„ ํ•˜๋“ **, ํ˜น์€ ๋‹จ์ˆœํžˆ **์—ฐ์‚ฐ์„ ์œ ์ฐฝํ•˜๊ฒŒ ์—ฐ๊ฒฐ(chain)ํ•˜๊ณ  ์‹ถ๋“ **, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„์™€๋“œ๋ฆฝ๋‹ˆ๋‹ค.
5
+ Semantic-TypeScript๋Š” JavaScript GeneratorFunction, Java Stream ๋ฐ MySQL Index์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ํ˜„๋Œ€์ ์ธ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•ต์‹ฌ ์„ค๊ณ„๋Š” ๋ฐ์ดํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ์˜ ์ŠคํŠธ๋ฆผ ์กฐ์ž‘ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
7
6
 
8
- ---
7
+ ๊ธฐ์กด์˜ ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ์™€ ๋‹ฌ๋ฆฌ Semantic์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ชจ๋“œ๋ฅผ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ๋•Œ, ํ„ฐ๋ฏธ๋„์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‹œ์ ์€ ์—…์ŠคํŠธ๋ฆผ์ด `accept` ๋ฐ `interrupt` ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์–ธ์ œ ํ˜ธ์ถœํ•˜๋Š”์ง€์— ์ „์ ์œผ๋กœ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค๊ณ„๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
9
8
 
10
- ## ๐Ÿงฉ ์ฃผ์š” ๊ธฐ๋Šฅ
11
-
12
- - โœ… ์ „์ฒด์ ์œผ๋กœ **ํƒ€์ž… ์•ˆ์ „ํ•œ ์ œ๋„ค๋ฆญ(Type-safe Generics)**
13
- - โœ… **ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ** (map, filter, reduce ๋“ฑ)
14
- - โœ… **์˜๋ฏธ๋ก ์  ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ(Semantic<E>)** - ์ง€์—ฐ ํ‰๊ฐ€(Lazy Evaluation) ์ง€์›
15
- - โœ… ์ŠคํŠธ๋ฆผ์„ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” **์ปฌ๋ ‰ํ„ฐ(Collectors)**
16
- - โœ… **์ •๋ ฌ๋œ(Sorted) ๋ฐ ๋น„์ •๋ ฌ๋œ(Unordered) ์ปฌ๋ ‰ํ„ฐ** โ€” `toUnordered()`๋Š” **๊ฐ€์žฅ ๋น ๋ฅด๋ฉฐ ์ •๋ ฌํ•˜์ง€ ์•Š์Œ**
17
- - โœ… `sorted()`, `toOrdered()`, ๋น„๊ต์ž(Comparator)๋ฅผ ํ†ตํ•œ **์ •๋ ฌ ๊ธฐ๋Šฅ**
18
- - โœ… **ํ†ต๊ณ„ ๋ถ„์„(Statistics)** (`NumericStatistics`, `BigIntStatistics` ๋“ฑ)
19
- - โœ… **Optional<T>** โ€” null ๋˜๋Š” undefined ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ชจ๋‚˜๋“œ(Monad)
20
- - โœ… **๋ฐ˜๋ณต์ž(Iterator) & ์ƒ์„ฑ๊ธฐ(Generator)** ๊ธฐ๋ฐ˜ ์„ค๊ณ„ โ€” ๋Œ€๊ทœ๋ชจ ๋˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ์—๋„ ์ ํ•ฉ
21
-
22
- ---
23
-
24
- ## ๐Ÿ“ฆ ์„ค์น˜
9
+ ## ์„ค์น˜
25
10
 
26
11
  ```bash
27
12
  npm install semantic-typescript
28
13
  ```
29
14
 
30
- ---
31
-
32
- ## ๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋…
33
-
34
- ### 1. `Optional<T>` โ€” null/undefined ๊ฐ’ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
35
-
36
- ๊ฐ’์ด null ๋˜๋Š” undefined ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋”•(Monadic) ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
37
-
38
- #### ๋ฉ”์„œ๋“œ:
39
-
40
- | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์˜ˆ์ œ |
41
- |--------|------|------|
42
- | `of(value)` | ๊ฐ’ ๊ฐ์‹ธ๊ธฐ (null ๊ฐ€๋Šฅ) | `Optional.of(null)` |
43
- | `ofNullable(v)` | null ํ—ˆ์šฉํ•˜์—ฌ ๊ฐ์‹ธ๊ธฐ | `Optional.ofNullable(someVar)` |
44
- | `ofNonNull(v)` | null์ด๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ | `Optional.ofNonNull(5)` |
45
- | `get()` | ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ (์—†์œผ๋ฉด ์˜ˆ์™ธ) | `opt.get()` |
46
- | `getOrDefault(d)` | ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ | `opt.getOrDefault(0)` |
47
- | `ifPresent(fn)` | ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ถ€์ž‘์šฉ ์‹คํ–‰ | `opt.ifPresent(x => console.log(x))` |
48
- | `map(fn)` | ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ณ€ํ™˜ | `opt.map(x => x + 1)` |
49
- | `filter(fn)` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’๋งŒ ์œ ์ง€ | `opt.filter(x => x > 0)` |
50
- | `isEmpty()` | ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ | `opt.isEmpty()` |
51
- | `isPresent()` | ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธ | `opt.isPresent()` |
15
+ ## ๊ธฐ๋ณธ ํƒ€์ž…
52
16
 
53
- #### ์˜ˆ์ œ:
17
+ | ํƒ€์ž… | ์„ค๋ช… |
18
+ |------|------|
19
+ | `Invalid<T>` | null ๋˜๋Š” undefined๋ฅผ ํ™•์žฅํ•˜๋Š” ํƒ€์ž… |
20
+ | `Valid<T>` | null๊ณผ undefined๋ฅผ ์ œ์™ธํ•˜๋Š” ํƒ€์ž… |
21
+ | `MaybeInvalid<T>` | null ๋˜๋Š” undefined๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… |
22
+ | `Primitive` | ๊ธฐ๋ณธ ํƒ€์ž… ์ปฌ๋ ‰์…˜ |
23
+ | `MaybePrimitive<T>` | ๊ธฐ๋ณธ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… |
24
+ | `OptionalSymbol` | Optional ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
25
+ | `SemanticSymbol` | Semantic ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
26
+ | `CollectorsSymbol` | Collector ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
27
+ | `CollectableSymbol` | Collectable ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
28
+ | `OrderedCollectableSymbol` | OrderedCollectable ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
29
+ | `WindowCollectableSymbol` | WindowCollectable ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
30
+ | `StatisticsSymbol` | Statistics ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
31
+ | `NumericStatisticsSymbol` | NumericStatistics ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
32
+ | `BigIntStatisticsSymbol` | BigIntStatistics ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
33
+ | `UnorderedCollectableSymbol` | UnorderedCollectable ํด๋ž˜์Šค์˜ ์‹ฌ๋ณผ ์‹๋ณ„์ž |
34
+ | `Runnable` | ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ, ๋ฐ˜ํ™˜๊ฐ’ ์—†๋Š” ํ•จ์ˆ˜ |
35
+ | `Supplier<R>` | ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด R์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ |
36
+ | `Functional<T, R>` | ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€ํ™˜ ํ•จ์ˆ˜ |
37
+ | `Predicate<T>` | ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ๊ฑด ํ•จ์ˆ˜ |
38
+ | `BiFunctional<T, U, R>` | ์ด์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€ํ™˜ ํ•จ์ˆ˜ |
39
+ | `BiPredicate<T, U>` | ์ด์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ๊ฑด ํ•จ์ˆ˜ |
40
+ | `Comparator<T>` | ๋น„๊ต ํ•จ์ˆ˜ |
41
+ | `TriFunctional<T, U, V, R>` | ์‚ผ์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€ํ™˜ ํ•จ์ˆ˜ |
42
+ | `Consumer<T>` | ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†Œ๋น„ ํ•จ์ˆ˜ |
43
+ | `BiConsumer<T, U>` | ์ด์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†Œ๋น„ ํ•จ์ˆ˜ |
44
+ | `TriConsumer<T, U, V>` | ์‚ผ์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†Œ๋น„ ํ•จ์ˆ˜ |
45
+ | `Generator<T>` | ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜ |
54
46
 
55
47
  ```typescript
56
- import { Optional } from 'semantic-typescript';
57
-
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
59
-
60
- const opt = Optional.ofNullable(value);
61
-
62
- const result = opt
63
- .filter(v => v > 5)
64
- .map(v => v * 2)
65
- .getOrDefault(0);
66
-
67
- console.log(result); // 20 ๋˜๋Š” 0
48
+ // ํƒ€์ž… ์‚ฌ์šฉ ์˜ˆ์ œ
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
68
52
  ```
69
53
 
70
- ---
54
+ ## ํƒ€์ž… ๊ฐ€๋“œ
55
+
56
+ | ํ•จ์ˆ˜ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
57
+ |------|------|------------|------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | ๊ฐ’์ด null ๋˜๋Š” undefined๊ฐ€ ์•„๋‹˜์„ ๊ฒ€์ฆ | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | ๊ฐ’์ด null ๋˜๋Š” undefined์ž„์„ ๊ฒ€์ฆ | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | ๋ถˆ๋ฆฌ์–ธ ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | ๋ฌธ์ž์—ด ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | ์ˆซ์ž ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | ํ•จ์ˆ˜ ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | ๊ฐ์ฒด ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | ์‹ฌ๋ณผ ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | BigInt ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | ๊ธฐ๋ณธ ํƒ€์ž… ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Optional ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Semantic ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collector ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Collectable ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectable ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectable ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectable ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statistics ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatistics ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatistics ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ํ™•์ธ | O(1) | O(1) |
71
79
 
72
- ### 2. `Semantic<E>` โ€” ์ง€์—ฐ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
80
+ ```typescript
81
+ // ํƒ€์ž… ๊ฐ€๋“œ ์‚ฌ์šฉ ์˜ˆ์ œ
82
+ const value: unknown = "hello";
73
83
 
74
- ์š”์†Œ๋“ค์˜ **์ง€์—ฐ ํ‰๊ฐ€(Lazy), ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค**์ž…๋‹ˆ๋‹ค. Java์˜ Streams๋‚˜ Kotlin์˜ Sequences์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
84
+ if (isString(value)) {
85
+ console.log(value.length); // ํƒ€์ž… ์•ˆ์ „, value๋Š” string์œผ๋กœ ์ถ”๋ก 
86
+ }
75
87
 
76
- `from()`, `range()`, `iterate()`, `fill()` ๊ฐ™์€ ํ—ฌํผ ํ•จ์ˆ˜๋กœ `Semantic` ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
90
+ }
91
+ ```
77
92
 
78
- #### ์ƒ์„ฑ ๋ฐฉ๋ฒ•:
93
+ ## ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
79
94
 
80
- | ํ•จ์ˆ˜ | ์„ค๋ช… | ์˜ˆ์ œ |
81
- |------|------|------|
82
- | `from(iterable)` | ๋ฐฐ์—ด, Set, ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ | `from([1, 2, 3])` |
83
- | `range(start, end, step?)` | ์ˆซ์ž ๋ฒ”์œ„ ์ƒ์„ฑ | `range(0, 5)` โ†’ 0,1,2,3,4 |
84
- | `fill(element, count)` | ์š”์†Œ๋ฅผ N๋ฒˆ ๋ฐ˜๋ณต | `fill('a', 3n)` |
85
- | `iterate(gen)` | ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ | `iterate(genFn)` |
95
+ | ํ•จ์ˆ˜ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
96
+ |------|------|------------|------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | ๋ฒ”์šฉ ๋น„๊ต ํ•จ์ˆ˜ | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ | O(log n) | O(1) |
86
99
 
87
- #### ์ฃผ์š” ์—ฐ์‚ฐ์ž:
100
+ ```typescript
101
+ // ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์ œ
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
88
104
 
89
- | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์˜ˆ์ œ |
90
- |--------|------|------|
91
- | `map(fn)` | ๊ฐ ์š”์†Œ ๋ณ€ํ™˜ | `.map(x => x * 2)` |
92
- | `filter(fn)` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋งŒ ์œ ์ง€ | `.filter(x => x > 10)` |
93
- | `limit(n)` | ์ฒ˜์Œ N๊ฐœ ์š”์†Œ๋กœ ์ œํ•œ | `.limit(5)` |
94
- | `skip(n)` | ์ฒ˜์Œ N๊ฐœ ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ | `.skip(2)` |
95
- | `distinct()` | ์ค‘๋ณต ์ œ๊ฑฐ (๊ธฐ๋ณธ์ ์œผ๋กœ Set ์‚ฌ์šฉ) | `.distinct()` |
96
- | `sorted()` | ์š”์†Œ ์ •๋ ฌ (์ž์—ฐ ์ˆœ์„œ) | `.sorted()` |
97
- | `sorted(comparator)` | ์ปค์Šคํ…€ ์ •๋ ฌ | `.sorted((a, b) => a - b)` |
98
- | `toOrdered()` | ์ •๋ ฌ ํ›„ `OrderedCollectable` ๋ฐ˜ํ™˜ | `.toOrdered()` |
99
- | `toUnordered()` | **์ •๋ ฌ ์—†์Œ โ€“ ๊ฐ€์žฅ ๋น ๋ฆ„** | `.toUnordered()` โœ… |
100
- | `collect(collector)` | ์ปฌ๋ ‰ํ„ฐ๋กœ ์ง‘๊ณ„ | `.collect(Collector.full(...))` |
101
- | `toArray()` | ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ | `.toArray()` |
102
- | `toSet()` | Set์œผ๋กœ ๋ณ€ํ™˜ | `.toSet()` |
103
- | `toMap(keyFn, valFn)` | Map์œผ๋กœ ๋ณ€ํ™˜ | `.toMap(x => x.id, x => x)` |
105
+ const randomNum = useRandom(42); // ์‹œ๋“œ ๊ธฐ๋ฐ˜ ๋‚œ์ˆ˜
106
+ const randomBigInt = useRandom(1000n); // BigInt ๋‚œ์ˆ˜
107
+ ```
104
108
 
105
- ---
109
+ ## ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
106
110
 
107
- ### 3. `toUnordered()` โ€” ๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„, ์ •๋ ฌ ์—†์Œ
111
+ ### Optional ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
108
112
 
109
- **์ •๋ ฌ์ด ํ•„์š” ์—†๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด** ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์„ธ์š”:
113
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
114
+ |--------|------|------------|------------|
115
+ | `Optional.empty<T>()` | ๋นˆ Optional ์ƒ์„ฑ | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | ๊ฐ’์„ ๊ฐ€์ง„ Optional ์ƒ์„ฑ | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | null ํ—ˆ์šฉ Optional ์ƒ์„ฑ | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | null์ด ์•„๋‹Œ Optional ์ƒ์„ฑ | O(1) | O(1) |
110
119
 
111
120
  ```typescript
112
- const fastest = semanticStream.toUnordered();
121
+ // Optional ์‚ฌ์šฉ ์˜ˆ์ œ
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // 42 ์ถœ๋ ฅ
128
+ console.log(emptyOpt.orElse(100)); // 100 ์ถœ๋ ฅ
113
129
  ```
114
130
 
115
- ๐Ÿ”ฅ **์–ด๋– ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
116
- ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์†๋„๊ฐ€ ์ตœ์šฐ์„ ์ผ ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
117
-
118
- ---
131
+ ### Collector ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
119
132
 
120
- ### 4. `toOrdered()` ๋ฐ `sorted()` โ€” ์ •๋ ฌ๋œ ์ถœ๋ ฅ
121
-
122
- **์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
133
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
134
+ |--------|------|------------|------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | ์™„์ „ํ•œ ์ˆ˜์ง‘๊ธฐ ์ƒ์„ฑ | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ง‘๊ธฐ ์ƒ์„ฑ | O(1) | O(1) |
123
137
 
124
138
  ```typescript
125
- const ordered = semanticStream.sorted(); // ์ž์—ฐ ์ •๋ ฌ
126
- const customSorted = semanticStream.sorted((a, b) => a - b); // ์ปค์Šคํ…€ ๋น„๊ต์ž
127
- const orderedCollectable = semanticStream.toOrdered(); // ์ •๋ ฌ๋จ
139
+ // Collector ์‚ฌ์šฉ ์˜ˆ์ œ
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
145
+
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
128
148
  ```
129
149
 
130
- โš ๏ธ ์ด ๋ฉ”์„œ๋“œ๋“ค์€ **์š”์†Œ๋ฅผ ์ •๋ ฌ**ํ•˜๋ฉฐ, ์ž์—ฐ ์ •๋ ฌ ๋˜๋Š” ์ œ๊ณต๋œ ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
131
-
132
- ---
150
+ ### Semantic ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
133
151
 
134
- ### 5. `Collector<E, A, R>` โ€” ๋ฐ์ดํ„ฐ ์ง‘๊ณ„
135
-
136
- ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ **๋‹จ์ผ ๊ฐ’ ๋˜๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ์ถ•์•ฝ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
137
-
138
- ๋‚ด์žฅ๋œ ์ •์  ํŒฉํ† ๋ฆฌ:
152
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
153
+ |-------|------|-------------|-------------|
154
+ | `blob(blob, chunkSize)` | Blob์œผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | ๋นˆ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | ์ฑ„์›Œ์ง„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(n) | O(1) |
157
+ | `from<E>(iterable)` | ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(1) | O(1) |
158
+ | `interval(period, delay?)` | ์ •๊ธฐ์  ๊ฐ„๊ฒฉ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | ์ƒ์„ฑ๊ธฐ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(1) | O(1) |
160
+ | `range(start, end, step)` | ์ˆซ์ž ๋ฒ”์œ„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(n) | O(1) |
161
+ | `websocket(websocket)` | WebSocket์œผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | O(1) | O(1) |
139
162
 
140
163
  ```typescript
141
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
164
+ // Semantic ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์˜ˆ์‹œ
165
+
166
+ // Blob์œผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ (์ฒญํฌ ์ฝ๊ธฐ)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // ์ŠคํŠธ๋ฆผ ์“ฐ๊ธฐ ์„ฑ๊ณต
171
+ .catch(writeFi); // ์ŠคํŠธ๋ฆผ ์“ฐ๊ธฐ ์‹คํŒจ
172
+
173
+ // ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ๊ณผ ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋นˆ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
177
+
178
+ // ์ฑ„์›Œ์ง„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
180
+
181
+ // ์ดˆ๊ธฐ ์ง€์—ฐ 2์ดˆ, ์‹คํ–‰ ์ฃผ๊ธฐ 5์ดˆ์˜ ์‹œ๊ณ„์—ด ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
182
+ // ํƒ€์ด๋จธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๊ตฌํ˜„, ์‹œ์Šคํ…œ ์Šค์ผ€์ค„๋ง ์ œํ•œ์œผ๋กœ ์ธํ•œ ์‹œ๊ฐ„ ๋ณ€๋™ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
183
+ const intervalStream = interval(5000, 2000);
184
+
185
+ // ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
186
+ const numberStream = from([1, 2, 3, 4, 5]);
187
+ const stringStream = from(new Set(["Alex", "Bob"]));
188
+
189
+ // ๋ฒ”์œ„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
190
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
191
+
192
+ // WebSocket ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ
193
+ const ws = new WebSocket("ws://localhost:8080");
194
+ websocket(ws)
195
+ .filter((event)=> event.type === "message") // ๋ฉ”์‹œ์ง€ ์ด๋ฒคํŠธ๋งŒ ๋ชจ๋‹ˆํ„ฐ๋ง
196
+ .toUnordered() // ์ด๋ฒคํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Œ
197
+ .forEach((event)=> receive(event)); // ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
143
198
  ```
144
199
 
145
- ํ•˜์ง€๋งŒ ๋ณดํ†ต์€ `Collectable` ํด๋ž˜์Šค์˜ ๊ณ ์ˆ˜์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
146
-
147
- ---
148
-
149
- ### 6. `Collectable<E>` (์ถ”์ƒ ํด๋ž˜์Šค)
150
-
151
- ๋‹ค์Œ ํด๋ž˜์Šค๋“ค์˜ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค:
152
-
153
- - `OrderedCollectable<E>` โ€” ์ •๋ ฌ๋œ ์ถœ๋ ฅ
154
- - `UnorderedCollectable<E>` โ€” ์ •๋ ฌ ์—†์Œ, ๊ฐ€์žฅ ๋น ๋ฆ„
155
- - `WindowCollectable<E>` โ€” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
156
- - `Statistics<E, D>` โ€” ํ†ต๊ณ„ ์ง‘๊ณ„
157
-
158
- #### ๊ณตํ†ต ๋ฉ”์„œ๋“œ (์ƒ์†์„ ํ†ตํ•ด):
159
-
160
- | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์˜ˆ์ œ |
161
- |--------|------|------|
162
- | `count()` | ์š”์†Œ ๊ฐœ์ˆ˜ | `.count()` |
163
- | `toArray()` | ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ | `.toArray()` |
164
- | `toSet()` | Set์œผ๋กœ ๋ณ€ํ™˜ | `.toSet()` |
165
- | `toMap(k, v)` | Map์œผ๋กœ ๋ณ€ํ™˜ | `.toMap(x => x.id, x => x)` |
166
- | `group(k)` | ํ‚ค๋กœ ๊ทธ๋ฃนํ™” | `.group(x => x.category)` |
167
- | `findAny()` | ์ž„์˜์˜ ์š”์†Œ (Optional) | `.findAny()` |
168
- | `findFirst()` | ์ฒซ ๋ฒˆ์งธ ์š”์†Œ (Optional) | `.findFirst()` |
169
- | `reduce(...)` | ์ปค์Šคํ…€ ์ถ•์•ฝ | `.reduce((a,b) => a + b, 0)` |
170
-
171
- ---
172
-
173
- ### 7. `OrderedCollectable<E>` โ€” ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ
174
-
175
- ์š”์†Œ๋“ค์„ **์ž๋™์œผ๋กœ ์ •๋ ฌ**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
176
-
177
- **์ปค์Šคํ…€ ๋น„๊ต์ž**๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ž์—ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
200
+ ## Semantic ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ
201
+
202
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
203
+ |--------|------|------------|------------|
204
+ | `concat(other)` | ๋‘ ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ | O(n) | O(1) |
205
+ | `distinct()` | ์ค‘๋ณต ์ œ๊ฑฐ | O(n) | O(n) |
206
+ | `distinct(comparator)` | ๋น„๊ต๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ค‘๋ณต ์ œ๊ฑฐ | O(nยฒ) | O(n) |
207
+ | `dropWhile(predicate)` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ ๋ฒ„๋ฆฌ๊ธฐ | O(n) | O(1) |
208
+ | `filter(predicate)` | ์š”์†Œ ํ•„ํ„ฐ๋ง | O(n) | O(1) |
209
+ | `flat(mapper)` | ํ‰๋ฉดํ™” ๋งคํ•‘ | O(n ร— m) | O(1) |
210
+ | `flatMap(mapper)` | ์ƒˆ๋กœ์šด ํƒ€์ž…์œผ๋กœ ํ‰๋ฉดํ™” ๋งคํ•‘ | O(n ร— m) | O(1) |
211
+ | `limit(n)` | ์š”์†Œ ์ˆ˜ ์ œํ•œ | O(n) | O(1) |
212
+ | `map(mapper)` | ๋งคํ•‘ ๋ณ€ํ™˜ | O(n) | O(1) |
213
+ | `peek(consumer)` | ์š”์†Œ ๊ฒ€์‚ฌ | O(n) | O(1) |
214
+ | `redirect(redirector)` | ์ธ๋ฑ์Šค ๋ฆฌ๋””๋ ‰์…˜ | O(n) | O(1) |
215
+ | `reverse()` | ์ŠคํŠธ๋ฆผ ๋ฐ˜์ „ | O(n) | O(1) |
216
+ | `shuffle()` | ๋ฌด์ž‘์œ„ ์…”ํ”Œ | O(n) | O(1) |
217
+ | `shuffle(mapper)` | ๋งคํผ๋ฅผ ์‚ฌ์šฉํ•œ ์…”ํ”Œ | O(n) | O(1) |
218
+ | `skip(n)` | ์ฒ˜์Œ n๊ฐœ ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ | O(n) | O(1) |
219
+ | `sorted()` | ์ •๋ ฌ | O(n log n) | O(n) |
220
+ | `sorted(comparator)` | ๋น„๊ต๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ •๋ ฌ | O(n log n) | O(n) |
221
+ | `sub(start, end)` | ์„œ๋ธŒ ์ŠคํŠธ๋ฆผ ๊ฐ€์ ธ์˜ค๊ธฐ | O(n) | O(1) |
222
+ | `takeWhile(predicate)` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ | O(n) | O(1) |
223
+ | `translate(offset)` | ์ธ๋ฑ์Šค ๋ณ€ํ™˜ | O(n) | O(1) |
224
+ | `translate(translator)` | ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค ๋ณ€ํ™˜ | O(n) | O(1) |
178
225
 
179
226
  ```typescript
180
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
227
+ // Semantic ์ž‘์—… ์˜ˆ์ œ
228
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
229
+ .filter(n => n % 2 === 0) // ์ง์ˆ˜ ํ•„ํ„ฐ๋ง
230
+ .map(n => n * 2) // 2๋ฐฐ ๋ณ€ํ™˜
231
+ .skip(1) // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
232
+ .limit(3) // 3๊ฐœ ์š”์†Œ๋กœ ์ œํ•œ
233
+ .toArray(); // ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
234
+ // ๊ฒฐ๊ณผ: [8, 12, 20]
235
+
236
+ // ๋ณต์žกํ•œ ์ž‘์—… ์˜ˆ์ œ
237
+ const complexResult = range(1, 100, 1)
238
+ .flatMap(n => from([n, n * 2])) // ๊ฐ ์š”์†Œ๋ฅผ 2๊ฐœ ์š”์†Œ๋กœ ๋งคํ•‘
239
+ .distinct() // ์ค‘๋ณต ์ œ๊ฑฐ
240
+ .shuffle() // ๋ฌด์ž‘์œ„ ์…”ํ”Œ
241
+ .takeWhile(n => n < 50) // 50 ๋ฏธ๋งŒ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ
242
+ .toOrdered() // ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ๋กœ ๋ณ€ํ™˜
243
+ .toArray(); // ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
182
244
  ```
183
245
 
184
- ๐Ÿ”’ **์ •๋ ฌ๋œ ์ถœ๋ ฅ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.**
246
+ ## ์ˆ˜์ง‘๊ธฐ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ
185
247
 
186
- ---
187
-
188
- ### 8. `UnorderedCollectable<E>` โ€” ์ •๋ ฌ ์—†์Œ (๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„)
189
-
190
- **์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
248
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
249
+ |--------|------|------------|------------|
250
+ | `toUnoredered()` | ๋น„์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ๋กœ ๋ณ€ํ™˜ (์„ฑ๋Šฅ ์šฐ์„ ) | O(1) | O(1) |
251
+ | `toOrdered()` | ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ๋กœ ๋ณ€ํ™˜ | O(1) | O(1) |
252
+ | `sorted()` | ์ •๋ ฌ ํ›„ ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ๋กœ ๋ณ€ํ™˜ | O(n log n) | O(n) |
253
+ | `toWindow()` | ์œˆ๋„์šฐ ์ˆ˜์ง‘๊ธฐ๋กœ ๋ณ€ํ™˜ | O(1) | O(1) |
254
+ | `toNumericStatistics()` | ์ˆซ์ž ํ†ต๊ณ„๋กœ ๋ณ€ํ™˜ | O(1) | O(1) |
255
+ | `toBigintStatistics()` | BigInt ํ†ต๊ณ„๋กœ ๋ณ€ํ™˜ | O(1) | O(1) |
191
256
 
192
257
  ```typescript
193
- const unordered = new UnorderedCollectable(stream);
194
- // ๋˜๋Š”
195
- const fastest = semanticStream.toUnordered();
258
+ // ์ˆ˜์ง‘๊ธฐ ๋ณ€ํ™˜ ์˜ˆ์ œ
259
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
260
+
261
+ // ์„ฑ๋Šฅ ์šฐ์„ : ๋น„์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ ์‚ฌ์šฉ
262
+ const unordered = numbers
263
+ .filter(n => n > 3)
264
+ .toUnoredered();
265
+
266
+ // ์ •๋ ฌ ํ•„์š”: ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ ์‚ฌ์šฉ
267
+ const ordered = numbers
268
+ .sorted()
269
+ .toOrdered();
270
+
271
+ // ํ†ต๊ณ„ ๋ถ„์„: ํ†ต๊ณ„ ์ˆ˜์ง‘๊ธฐ ์‚ฌ์šฉ
272
+ const stats = numbers
273
+ .toNumericStatistics();
274
+
275
+ console.log(stats.mean()); // ํ‰๊ท ๊ฐ’
276
+ console.log(stats.median()); // ์ค‘์•™๊ฐ’
277
+ console.log(stats.standardDeviation()); // ํ‘œ์ค€ํŽธ์ฐจ
278
+
279
+ // ์œˆ๋„์šฐ ์ž‘์—…
280
+ const windowed = numbers
281
+ .toWindow()
282
+ .tumble(3n); // 3๊ฐœ ์š”์†Œ ์œˆ๋„์šฐ
283
+
284
+ windowed.forEach(window => {
285
+ console.log(window.toArray()); // ๊ฐ ์œˆ๋„์šฐ ๋‚ด์šฉ
286
+ });
196
287
  ```
197
288
 
198
- โœ… **์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ**
199
- โœ… **์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ**
200
-
201
- ---
202
-
203
- ### 9. `Statistics<E, D>` โ€” ํ†ต๊ณ„ ๋ถ„์„
204
-
205
- ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
206
-
207
- #### ์„œ๋ธŒ ํด๋ž˜์Šค:
208
-
209
- - `NumericStatistics<E>` โ€” `number` ๊ฐ’์šฉ
210
- - `BigIntStatistics<E>` โ€” `bigint` ๊ฐ’์šฉ
211
-
212
- ##### ์ฃผ์š” ํ†ต๊ณ„ ๋ฉ”์„œ๋“œ:
213
-
214
- | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์˜ˆ์ œ |
215
- |--------|------|------|
216
- | `mean()` | ํ‰๊ท  | `.mean()` |
217
- | `median()` | ์ค‘์•™๊ฐ’ | `.median()` |
218
- | `mode()` | ์ตœ๋นˆ๊ฐ’ | `.mode()` |
219
- | `minimum()` | ์ตœ์†Ÿ๊ฐ’ | `.minimum()` |
220
- | `maximum()` | ์ตœ๋Œ“๊ฐ’ | `.maximum()` |
221
- | `range()` | ์ตœ๋Œ“๊ฐ’ - ์ตœ์†Ÿ๊ฐ’ | `.range()` |
222
- | `variance()` | ๋ถ„์‚ฐ | `.variance()` |
223
- | `standardDeviation()` | ํ‘œ์ค€ ํŽธ์ฐจ | `.standardDeviation()` |
224
- | `summate()` | ํ•ฉ๊ณ„ | `.summate()` |
225
- | `quantile(q)` | q๋ถ„์œ„์ˆ˜ (0~1) | `.quantile(0.5)` โ†’ ์ค‘์•™๊ฐ’ |
226
- | `frequency()` | ๋นˆ๋„ ๋งต | `.frequency()` |
227
-
228
- ---
229
-
230
- ## ๐Ÿงช ์ „์ฒด ์˜ˆ์ œ
289
+ ## Collectable ์ˆ˜์ง‘ ๋ฉ”์„œ๋“œ
290
+
291
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
292
+ |--------|------|------------|------------|
293
+ | `anyMatch(predicate)` | ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ | O(n) | O(1) |
294
+ | `allMatch(predicate)` | ๋ชจ๋“  ์š”์†Œ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ | O(n) | O(1) |
295
+ | `count()` | ์š”์†Œ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ | O(n) | O(1) |
296
+ | `isEmpty()` | ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธ | O(1) | O(1) |
297
+ | `findAny()` | ์•„๋ฌด ์š”์†Œ ์ฐพ๊ธฐ | O(n) | O(1) |
298
+ | `findFirst()` | ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์ฐพ๊ธฐ | O(n) | O(1) |
299
+ | `findLast()` | ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ฐพ๊ธฐ | O(n) | O(1) |
300
+ | `forEach(action)` | ๋ชจ๋“  ์š”์†Œ ๋ฐ˜๋ณต | O(n) | O(1) |
301
+ | `group(classifier)` | ๋ถ„๋ฅ˜๊ธฐ๋กœ ๊ทธ๋ฃนํ™” | O(n) | O(n) |
302
+ | `groupBy(keyExtractor, valueExtractor)` | ํ‚ค-๊ฐ’ ์ถ”์ถœ๊ธฐ๋กœ ๊ทธ๋ฃนํ™” | O(n) | O(n) |
303
+ | `join()` | ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉ | O(n) | O(n) |
304
+ | `join(delimiter)` | ๊ตฌ๋ถ„์ž๋กœ ๊ฒฐํ•ฉ | O(n) | O(n) |
305
+ | `nonMatch(predicate)` | ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์—†์Œ ํ™•์ธ | O(n) | O(1) |
306
+ | `partition(count)` | ๊ฐœ์ˆ˜๋กœ ๋ถ„ํ•  | O(n) | O(n) |
307
+ | `partitionBy(classifier)` | ๋ถ„๋ฅ˜๊ธฐ๋กœ ๋ถ„ํ•  | O(n) | O(n) |
308
+ | `reduce(accumulator)` | ์ถ•์†Œ ์ž‘์—… | O(n) | O(1) |
309
+ | `reduce(identity, accumulator)` | ์ดˆ๊ธฐ๊ฐ’์„ ์‚ฌ์šฉํ•œ ์ถ•์†Œ | O(n) | O(1) |
310
+ | `toArray()` | ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ | O(n) | O(n) |
311
+ | `toMap(keyExtractor, valueExtractor)` | Map์œผ๋กœ ๋ณ€ํ™˜ | O(n) | O(n) |
312
+ | `toSet()` | Set์œผ๋กœ ๋ณ€ํ™˜ | O(n) | O(n) |
313
+ | `write(stream)` | ์ŠคํŠธ๋ฆผ์— ์“ฐ๊ธฐ | O(n) | O(1) |
231
314
 
232
315
  ```typescript
233
- import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
-
235
- // ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ
236
- const numbers = from([10, 2, 8, 4, 5, 6]);
237
-
238
- // ๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„: ์ •๋ ฌ ์—†์Œ
239
- const fastest = numbers.toUnordered();
240
- console.log(fastest.toArray()); // ์˜ˆ: [10, 2, 8, 4, 5, 6] (์›๋ž˜ ์ˆœ์„œ)
241
-
242
- // ๐Ÿ”ข ์ž์—ฐ ์ •๋ ฌ
243
- const ordered = numbers.sorted();
244
- console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
-
246
- // ๐Ÿ“Š ํ†ต๊ณ„ ๋ถ„์„
247
- const stats = new NumericStatistics(numbers);
248
- console.log('ํ‰๊ท :', stats.mean());
249
- console.log('์ค‘์•™๊ฐ’:', stats.median());
250
- console.log('์ตœ๋นˆ๊ฐ’:', stats.mode());
251
- console.log('๋ฒ”์œ„:', stats.range());
252
- console.log('ํ‘œ์ค€ ํŽธ์ฐจ:', stats.standardDeviation());
316
+ // Collectable ์ž‘์—… ์˜ˆ์ œ
317
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
318
+ .filter(n => n % 2 === 0)
319
+ .toOrdered();
320
+
321
+ // ์ผ์น˜ ํ™•์ธ
322
+ console.log(data.anyMatch(n => n > 5)); // true
323
+ console.log(data.allMatch(n => n < 20)); // true
324
+
325
+ // ๊ฒ€์ƒ‰ ์ž‘์—…
326
+ data.findFirst().ifPresent(n => console.log(n)); // 2
327
+ data.findAny().ifPresent(n => console.log(n)); // ์•„๋ฌด ์š”์†Œ
328
+
329
+ // ๊ทธ๋ฃนํ™” ์ž‘์—…
330
+ const grouped = data.groupBy(
331
+ n => n > 5 ? "large" : "small",
332
+ n => n * 2
333
+ );
334
+ // {small: [4, 8], large: [12, 16, 20]}
335
+
336
+ // ์ถ•์†Œ ์ž‘์—…
337
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
338
+
339
+ // ์ถœ๋ ฅ ์ž‘์—…
340
+ data.join(", "); // "2, 4, 6, 8, 10"
253
341
  ```
254
342
 
255
- ---
256
-
257
- ## ๐Ÿ› ๏ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
258
-
259
- ๋‹ค์–‘ํ•œ **ํƒ€์ž… ๊ฐ€๋“œ(Type Guards)** ์™€ **๋น„๊ต ๋„๊ตฌ**๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
260
-
261
- | ํ•จ์ˆ˜ | ์šฉ๋„ |
262
- |------|------|
263
- | `isString(x)` | `string` ํƒ€์ž… ๊ฐ€๋“œ |
264
- | `isNumber(x)` | `number` ํƒ€์ž… ๊ฐ€๋“œ |
265
- | `isBoolean(x)` | `boolean` ํƒ€์ž… ๊ฐ€๋“œ |
266
- | `isIterable(x)` | ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ |
267
- | `useCompare(a, b)` | ๋ฒ”์šฉ ๋น„๊ต ํ•จ์ˆ˜ |
268
- | `useRandom(x)` | ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ (์žฌ๋ฏธ์‚ผ์•„) |
269
-
270
- ---
271
-
272
- ## ๐Ÿงฉ ๊ณ ๊ธ‰: ์ปค์Šคํ…€ ์ƒ์„ฑ๊ธฐ & ์œˆ๋„์šฐ
273
-
274
- ๋ฌดํ•œ ๋˜๋Š” ์ œ์–ด๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•œ **์ปค์Šคํ…€ ์ƒ์„ฑ๊ธฐ**๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
343
+ ## ํ†ต๊ณ„ ๋ถ„์„ ๋ฉ”์„œ๋“œ
344
+
345
+ ### NumericStatistics ๋ฉ”์„œ๋“œ
346
+
347
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
348
+ |--------|------|------------|------------|
349
+ | `range()` | ๋ฒ”์œ„ | O(n) | O(1) |
350
+ | `variance()` | ๋ถ„์‚ฐ | O(n) | O(1) |
351
+ | `standardDeviation()` | ํ‘œ์ค€ํŽธ์ฐจ | O(n) | O(1) |
352
+ | `mean()` | ํ‰๊ท  | O(n) | O(1) |
353
+ | `median()` | ์ค‘์•™๊ฐ’ | O(n log n) | O(n) |
354
+ | `mode()` | ์ตœ๋นˆ๊ฐ’ | O(n) | O(n) |
355
+ | `frequency()` | ๋นˆ๋„ ๋ถ„ํฌ | O(n) | O(n) |
356
+ | `summate()` | ํ•ฉ๊ณ„ | O(n) | O(1) |
357
+ | `quantile(quantile)` | ๋ถ„์œ„์ˆ˜ | O(n log n) | O(n) |
358
+ | `interquartileRange()` | ์‚ฌ๋ถ„์œ„ ๋ฒ”์œ„ | O(n log n) | O(n) |
359
+ | `skewness()` | ์™œ๋„ | O(n) | O(1) |
360
+ | `kurtosis()` | ์ฒจ๋„ | O(n) | O(1) |
275
361
 
276
362
  ```typescript
277
- const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
- for (let i = 0; i < 10; i++) {
279
- accept(i, BigInt(i));
280
- if (i === 5) interrupt(i);
281
- }
282
- };
283
-
284
- const s = new Semantic(gen);
363
+ // ํ†ต๊ณ„ ๋ถ„์„ ์˜ˆ์ œ
364
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
365
+ .toNumericStatistics();
366
+
367
+ console.log("ํ‰๊ท :", numbers.mean()); // 5.5
368
+ console.log("์ค‘์•™๊ฐ’:", numbers.median()); // 5.5
369
+ console.log("ํ‘œ์ค€ํŽธ์ฐจ:", numbers.standardDeviation()); // ~2.87
370
+ console.log("ํ•ฉ๊ณ„:", numbers.summate()); // 55
371
+
372
+ // ๋งคํผ๋ฅผ ์‚ฌ์šฉํ•œ ํ†ต๊ณ„ ๋ถ„์„
373
+ const objects = from([
374
+ { value: 10 },
375
+ { value: 20 },
376
+ { value: 30 }
377
+ ]).toNumericStatistics();
378
+
379
+ console.log("๋งคํ•‘๋œ ํ‰๊ท :", objects.mean(obj => obj.value)); // 20
285
380
  ```
286
381
 
287
- ๋˜๋Š” **์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
382
+ ## ์„ฑ๋Šฅ ์„ ํƒ ๊ฐ€์ด๋“œ
288
383
 
384
+ ### ๋น„์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ ์„ ํƒ (์„ฑ๋Šฅ ์šฐ์„ )
289
385
  ```typescript
290
- const windowed = ordered.slide(3n, 2n); // ํฌ๊ธฐ 3, ์Šคํ… 2
386
+ // ์ˆœ์„œ ๋ณด์žฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
387
+ const highPerformance = data
388
+ .filter(predicate)
389
+ .map(mapper)
390
+ .toUnoredered(); // ์ตœ๊ณ  ์„ฑ๋Šฅ
291
391
  ```
292
392
 
293
- ---
294
-
295
- ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค
296
-
297
- ์ด ํ”„๋กœ์ ํŠธ๋Š” **MIT ๋ผ์ด์„ ์Šค** ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ƒ์—…์ ยท๊ฐœ์ธ์  ์šฉ๋„๋กœ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
298
-
299
- ---
300
-
301
- ## ๐Ÿ™Œ ๊ธฐ์—ฌ
302
-
303
- Pull Request, ์ด์Šˆ(Issue), ์•„์ด๋””์–ด ์ œ์•ˆ ๋“ฑ ๋ชจ๋‘ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!
304
-
305
- ---
306
-
307
- ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ์š”์•ฝ
308
-
309
- | ์ž‘์—… | ๋ฉ”์„œ๋“œ |
310
- |------|--------|
311
- | null/undefined ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ | `Optional<T>` |
312
- | ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `from([...])`, `range()`, `fill()` |
313
- | ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ | `map()`, `filter()` |
314
- | ๋ฐ์ดํ„ฐ ์ •๋ ฌ | `sorted()`, `toOrdered()` |
315
- | ์ •๋ ฌ ์—†์Œ (๊ฐ€์žฅ ๋น ๋ฆ„) | `toUnordered()` โœ… |
316
- | ๊ทธ๋ฃนํ™” / ์ง‘๊ณ„ | `toMap()`, `group()`, `Collector` |
317
- | ํ†ต๊ณ„ | `NumericStatistics`, `mean()`, `median()` ๋“ฑ |
393
+ ### ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ ์„ ํƒ (์ˆœ์„œ ํ•„์š”)
394
+ ```typescript
395
+ // ์š”์†Œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
396
+ const ordered = data.sorted(comparator);
397
+ ```
318
398
 
319
- ---
399
+ ### ์œˆ๋„์šฐ ์ˆ˜์ง‘๊ธฐ ์„ ํƒ (์œˆ๋„์šฐ ์ž‘์—…)
400
+ ```typescript
401
+ // ์œˆ๋„์šฐ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
402
+ const windowed = data
403
+ .toWindow()
404
+ .slide(5n, 2n); // ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
405
+ ```
320
406
 
321
- ## ๐Ÿ”— ๋งํฌ
407
+ ### ํ†ต๊ณ„ ๋ถ„์„ ์„ ํƒ (์ˆซ์ž ๊ณ„์‚ฐ)
408
+ ```typescript
409
+ // ํ†ต๊ณ„ ๋ถ„์„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
410
+ const stats = data
411
+ .toNumericStatistics(); // ์ˆซ์ž ํ†ต๊ณ„
322
412
 
323
- - ๐Ÿ“ฆ npm: https://www.npmjs.com/package/semantic-typescript
324
- - ๐Ÿ™ GitHub: https://github.com/eloyhere/semantic-typescript
325
- - ๐Ÿ“˜ ๋ฌธ์„œ: ์†Œ์Šค ์ฝ”๋“œ / ํƒ€์ž… ์ •์˜ ์ฐธ์กฐ
413
+ const bigIntStats = data
414
+ .toBigintStatistics(); // BigInt ํ†ต๊ณ„
415
+ ```
326
416
 
327
- ---
417
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
418
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
328
419
 
329
- **TypeScript์—์„œ ํ•จ์ˆ˜ํ˜•, ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ฆ๊ฒจ๋ณด์„ธ์š”.** ๐Ÿš€
420
+ ## ์ค‘์š”ํ•œ ์ฃผ์˜์‚ฌํ•ญ
330
421
 
331
- ---
422
+ 1. **์ •๋ ฌ ์ž‘์—…์˜ ์˜ํ–ฅ**: ์ •๋ ฌ๋œ ์ˆ˜์ง‘๊ธฐ์—์„œ `sorted()` ์ž‘์—…์€ `redirect`, `translate`, `shuffle`, `reverse` ํšจ๊ณผ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค
423
+ 2. **์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ**: ์ˆœ์„œ ๋ณด์žฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด `toUnoredered()`๋ฅผ ์šฐ์„ ํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์–ป์œผ์„ธ์š”
424
+ 3. **๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰**: ์ •๋ ฌ ์ž‘์—…์—๋Š” O(n)์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
425
+ 4. **์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ**: Semantic ์ŠคํŠธ๋ฆผ์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•˜๋ฉฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
332
426
 
333
- โœ… **์ฐธ๊ณ :**
334
- - `toUnordered()` โ†’ **์ •๋ ฌ ์—†์Œ, ๊ฐ€์žฅ ๋น ๋ฆ„**
335
- - ๊ทธ ์™ธ (`sorted()`, `toOrdered()` ๋“ฑ) โ†’ **๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•จ**
427
+ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” TypeScript ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ด์ ๊ณผ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.