semantic-typescript 0.0.7 โ†’ 0.0.8

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,529 @@
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
- ## ๐Ÿงฉ ์ฃผ์š” ๊ธฐ๋Šฅ
9
+ ## ํ•ต์‹ฌ ๊ธฐ๋Šฅ
11
10
 
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
- ## ๐Ÿ“ฆ ์„ค์น˜
25
-
26
- ```bash
27
- npm install semantic-typescript
28
- ```
29
-
30
- ---
11
+ | ๊ธฐ๋Šฅ | ์„ค๋ช… | ์žฅ์  |
12
+ |------|------|------|
13
+ | **ํƒ€์ž… ์•ˆ์ „ ์ œ๋„ค๋ฆญ** | ์™„์ „ํ•œ TypeScript ํƒ€์ž… ์ง€์› | ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฐ์ง€, ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜ |
14
+ | **ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ** | ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ | ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ, ์‰ฌ์šด ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ |
15
+ | **์ง€์—ฐ ํ‰๊ฐ€** | ์ฃผ๋ฌธํ˜• ๊ณ„์‚ฐ, ์„ฑ๋Šฅ ์ตœ์ ํ™” | ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ |
16
+ | **๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ** | ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ | ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉ |
17
+ | **๋‹ค์ค‘ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ˆ˜์ง‘๊ธฐ** | ์ •๋ ฌ, ๋น„์ •๋ ฌ, ํ†ต๊ณ„์  ์ˆ˜์ง‘ ์ „๋žต | ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ฅธ ์ตœ์  ์ „๋žต ์„ ํƒ |
18
+ | **ํ†ต๊ณ„ ๋ถ„์„** | ๋‚ด์žฅ๋œ ์™„์ „ํ•œ ํ†ต๊ณ„ ๊ณ„์‚ฐ ํ•จ์ˆ˜ | ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋ณด๊ณ ์„œ ์ƒ์„ฑ |
19
+
20
+ ## ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ
21
+
22
+ **์ค‘์š” ์ฐธ๊ณ **: ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์„ฑ๋Šฅ์„ ํฌ์ƒํ•ฉ๋‹ˆ๋‹ค:
23
+ - `toOrdered()`
24
+ - `toWindow()`
25
+ - `toNumericStatistics()`
26
+ - `toBigIntStatistics()`
27
+ - `sorted()`
28
+ - `sorted(comparator)`
29
+
30
+ ํŠนํžˆ ์ค‘์š”: `sorted()` ๋ฐ `sorted(comparator)`๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
31
+ - `redirect(redirector)`
32
+ - `translate(translator)`
33
+ - `shuffle(mapper)`
34
+
35
+ ## ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
36
+
37
+ ### ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ํŒฉํ† ๋ฆฌ
38
+
39
+ | ๋ฉ”์„œ๋“œ | ์‹œ๊ทธ๋‹ˆ์ฒ˜ | ์„ค๋ช… | ์˜ˆ์‹œ |
40
+ |------|------|------|------|
41
+ | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Blob์„ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ | `blob(fileBlob, 1024n)` |
42
+ | `empty` | `<E>() => Semantic<E>` | ๋นˆ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `empty<number>()` |
43
+ | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | ์ง€์ •๋œ ์ˆ˜์˜ ์š”์†Œ๋กœ ์ฑ„์›€ | `fill("hello", 5n)` |
44
+ | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `from([1, 2, 3])` |
45
+ | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | ์ˆซ์ž ๋ฒ”์œ„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `range(1, 10, 2)` |
46
+ | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `iterate(myGenerator)` |
47
+ | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | WebSocket์œผ๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ | `websocket(socket)` |
48
+
49
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
50
+ ```typescript
51
+ import { from, range, fill, empty } from 'semantic-typescript';
31
52
 
32
- ## ๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋…
53
+ // ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
54
+ const numberStream = from([1, 2, 3, 4, 5]);
33
55
 
34
- ### 1. `Optional<T>` โ€” null/undefined ๊ฐ’ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
56
+ // ์ˆซ์ž ๋ฒ”์œ„ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
57
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
35
58
 
36
- ๊ฐ’์ด null ๋˜๋Š” undefined ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋”•(Monadic) ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
59
+ // ๋ฐ˜๋ณต ์š”์†Œ๋กœ ์ฑ„์›€
60
+ const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
37
61
 
38
- #### ๋ฉ”์„œ๋“œ:
62
+ // ๋นˆ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
63
+ const emptyStream = empty<number>();
64
+ ```
39
65
 
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()` |
66
+ ### ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ
52
67
 
53
- #### ์˜ˆ์ œ:
68
+ | ๋ฉ”์„œ๋“œ | ์‹œ๊ทธ๋‹ˆ์ฒ˜ | ์„ค๋ช… | ์˜ˆ์‹œ |
69
+ |------|------|------|------|
70
+ | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์ฆ | `validate(null)` โ†’ `false` |
71
+ | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | ๊ฐ’์ด ๋ฌดํšจํ•œ์ง€ ๊ฒ€์ฆ | `invalidate(0)` โ†’ `false` |
72
+ | `useCompare` | `<T>(t1: T, t2: T) => number` | ์ผ๋ฐ˜ ๋น„๊ต ํ•จ์ˆ˜ | `useCompare("a", "b")` โ†’ `-1` |
73
+ | `useRandom` | `<T = number\|bigint>(index: T) => T` | ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ | `useRandom(5)` โ†’ ๋‚œ์ˆ˜ |
54
74
 
75
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
55
76
  ```typescript
56
- import { Optional } from 'semantic-typescript';
77
+ import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
57
78
 
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
79
+ // ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
80
+ const data: string | null = "hello";
81
+ if (validate(data)) {
82
+ console.log(data.toUpperCase()); // validate๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•œ ํ˜ธ์ถœ
83
+ }
59
84
 
60
- const opt = Optional.ofNullable(value);
85
+ const nullData: string | null = null;
86
+ if (invalidate(nullData)) {
87
+ console.log("๋ฐ์ดํ„ฐ ๋ฌดํšจ"); // invalidate๊ฐ€ null์„ ๊ฐ์ง€ํ–ˆ์œผ๋ฏ€๋กœ ์‹คํ–‰๋จ
88
+ }
61
89
 
62
- const result = opt
63
- .filter(v => v > 5)
64
- .map(v => v * 2)
65
- .getOrDefault(0);
90
+ // ๊ฐ’ ๋น„๊ต
91
+ const comparison = useCompare("apple", "banana"); // -1
66
92
 
67
- console.log(result); // 20 ๋˜๋Š” 0
93
+ // ๋‚œ์ˆ˜ ์ƒ์„ฑ
94
+ const randomNum = useRandom(42); // ์‹œ๋“œ 42 ๊ธฐ๋ฐ˜ ๋‚œ์ˆ˜
68
95
  ```
69
96
 
70
- ---
71
-
72
- ### 2. `Semantic<E>` โ€” ์ง€์—ฐ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
97
+ ## ํ•ต์‹ฌ ํด๋ž˜์Šค ์ƒ์„ธ
73
98
 
74
- ์š”์†Œ๋“ค์˜ **์ง€์—ฐ ํ‰๊ฐ€(Lazy), ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค**์ž…๋‹ˆ๋‹ค. Java์˜ Streams๋‚˜ Kotlin์˜ Sequences์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
99
+ ### Optional<T> - ์•ˆ์ „ํ•œ Null ๊ฐ’ ์ฒ˜๋ฆฌ
75
100
 
76
- `from()`, `range()`, `iterate()`, `fill()` ๊ฐ™์€ ํ—ฌํผ ํ•จ์ˆ˜๋กœ `Semantic` ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
101
+ Optional ํด๋ž˜์Šค๋Š” null ๋˜๋Š” undefined์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
77
102
 
78
- #### ์ƒ์„ฑ ๋ฐฉ๋ฒ•:
79
-
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)` |
86
-
87
- #### ์ฃผ์š” ์—ฐ์‚ฐ์ž:
88
-
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)` |
104
-
105
- ---
106
-
107
- ### 3. `toUnordered()` โ€” ๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„, ์ •๋ ฌ ์—†์Œ
108
-
109
- **์ •๋ ฌ์ด ํ•„์š” ์—†๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด** ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์„ธ์š”:
103
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ์‹œ๊ฐ„ ๋ณต์žก๋„ |
104
+ |------|----------|------|------------|
105
+ | `filter(predicate: Predicate<T>)` | `Optional<T>` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’ ํ•„ํ„ฐ๋ง | O(1) |
106
+ | `get()` | `T` | ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ, ๋น„์–ด์žˆ์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ | O(1) |
107
+ | `getOrDefault(defaultValue: T)` | `T` | ๊ฐ’ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ | O(1) |
108
+ | `ifPresent(action: Consumer<T>)` | `void` | ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ์•ก์…˜ ์‹คํ–‰ | O(1) |
109
+ | `isEmpty()` | `boolean` | ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ | O(1) |
110
+ | `isPresent()` | `boolean` | ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ | O(1) |
111
+ | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | ๊ฐ’ ๋งคํ•‘ ๋ฐ ๋ณ€ํ™˜ | O(1) |
112
+ | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Optional ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ | O(1) |
113
+ | `static ofNullable<T>(value?)` | `Optional<T>` | nullable Optional ์ƒ์„ฑ | O(1) |
114
+ | `static ofNonNull<T>(value: T)` | `Optional<T>` | non-null Optional ์ƒ์„ฑ | O(1) |
110
115
 
116
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
111
117
  ```typescript
112
- const fastest = semanticStream.toUnordered();
113
- ```
118
+ import { Optional } from 'semantic-typescript';
114
119
 
115
- ๐Ÿ”ฅ **์–ด๋– ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
116
- ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์†๋„๊ฐ€ ์ตœ์šฐ์„ ์ผ ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
120
+ // Optional ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
121
+ const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
117
122
 
118
- ---
123
+ // ์—ฐ์‡„ ์—ฐ์‚ฐ
124
+ const result = optionalValue
125
+ .filter(val => val.length > 3) // ๊ธธ์ด๊ฐ€ 3๋ณด๋‹ค ํฐ ๊ฐ’ ํ•„ํ„ฐ๋ง
126
+ .map(val => val.toUpperCase()) // ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
127
+ .getOrDefault("default"); // ๊ฐ’ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
119
128
 
120
- ### 4. `toOrdered()` ๋ฐ `sorted()` โ€” ์ •๋ ฌ๋œ ์ถœ๋ ฅ
129
+ console.log(result); // "HELLO" ๋˜๋Š” "default"
121
130
 
122
- **์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
131
+ // ์•ˆ์ „ํ•œ ์—ฐ์‚ฐ
132
+ optionalValue.ifPresent(val => {
133
+ console.log(`๊ฐ’ ์กด์žฌ: ${val}`);
134
+ });
123
135
 
124
- ```typescript
125
- const ordered = semanticStream.sorted(); // ์ž์—ฐ ์ •๋ ฌ
126
- const customSorted = semanticStream.sorted((a, b) => a - b); // ์ปค์Šคํ…€ ๋น„๊ต์ž
127
- const orderedCollectable = semanticStream.toOrdered(); // ์ •๋ ฌ๋จ
136
+ // ์ƒํƒœ ํ™•์ธ
137
+ if (optionalValue.isPresent()) {
138
+ console.log("๊ฐ’ ์žˆ์Œ");
139
+ } else if (optionalValue.isEmpty()) {
140
+ console.log("๋น„์–ด ์žˆ์Œ");
141
+ }
128
142
  ```
129
143
 
130
- โš ๏ธ ์ด ๋ฉ”์„œ๋“œ๋“ค์€ **์š”์†Œ๋ฅผ ์ •๋ ฌ**ํ•˜๋ฉฐ, ์ž์—ฐ ์ •๋ ฌ ๋˜๋Š” ์ œ๊ณต๋œ ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
131
-
132
- ---
133
-
134
- ### 5. `Collector<E, A, R>` โ€” ๋ฐ์ดํ„ฐ ์ง‘๊ณ„
144
+ ### Semantic<E> - ์ง€์—ฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
145
+
146
+ Semantic์€ ํ’๋ถ€ํ•œ ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
147
+
148
+ #### ์ŠคํŠธ๋ฆผ ๋ณ€ํ™˜ ์—ฐ์‚ฐ
149
+
150
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ์„ฑ๋Šฅ ์˜ํ–ฅ |
151
+ |------|----------|------|----------|
152
+ | `concat(other: Semantic<E>)` | `Semantic<E>` | ๋‘ ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ | O(n+m) |
153
+ | `distinct()` | `Semantic<E>` | ์ค‘๋ณต ์ œ๊ฑฐ (Set ์‚ฌ์šฉ) | O(n) |
154
+ | `distinct(comparator)` | `Semantic<E>` | ์‚ฌ์šฉ์ž ์ •์˜ ๋น„๊ต์ž ์ค‘๋ณต ์ œ๊ฑฐ | O(nยฒ) |
155
+ | `dropWhile(predicate)` | `Semantic<E>` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์‹œ์ž‘ ์š”์†Œ ๋ฒ„๋ฆผ | O(n) |
156
+ | `filter(predicate)` | `Semantic<E>` | ์š”์†Œ ํ•„ํ„ฐ๋ง | O(n) |
157
+ | `flat(mapper)` | `Semantic<E>` | ์ค‘์ฒฉ ์ŠคํŠธ๋ฆผ ํ‰ํƒ„ํ™” | O(nร—m) |
158
+ | `flatMap(mapper)` | `Semantic<R>` | ๋งคํ•‘ ๋ฐ ํ‰ํƒ„ํ™” | O(nร—m) |
159
+ | `limit(n)` | `Semantic<E>` | ์š”์†Œ ์ˆ˜ ์ œํ•œ | O(n) |
160
+ | `map(mapper)` | `Semantic<R>` | ์š”์†Œ ๋งคํ•‘ ๋ฐ ๋ณ€ํ™˜ | O(n) |
161
+ | `peek(consumer)` | `Semantic<E>` | ์š”์†Œ ํ™•์ธ (์ˆ˜์ • ์—†์Œ) | O(n) |
162
+ | `redirect(redirector)` | `Semantic<E>` | ์ธ๋ฑ์Šค ์žฌ์ง€์ • | O(n) |
163
+ | `reverse()` | `Semantic<E>` | ์ŠคํŠธ๋ฆผ ์ˆœ์„œ ๋ฐ˜์ „ | O(n) |
164
+ | `shuffle()` | `Semantic<E>` | ๋ฌด์ž‘์œ„ ์…”ํ”Œ | O(n) |
165
+ | `shuffle(mapper)` | `Semantic<E>` | ์‚ฌ์šฉ์ž ์ •์˜ ์…”ํ”Œ ๋กœ์ง | O(n) |
166
+ | `skip(n)` | `Semantic<E>` | ์ฒ˜์Œ n๊ฐœ ์š”์†Œ ๊ฑด๋„ˆ๋œ€ | O(n) |
167
+ | `sub(start, end)` | `Semantic<E>` | ๋ถ€๋ถ„ ์ŠคํŠธ๋ฆผ ๊ฐ€์ ธ์˜ค๊ธฐ | O(n) |
168
+ | `takeWhile(predicate)` | `Semantic<E>` | ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์‹œ์ž‘ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ | O(n) |
169
+ | `translate(offset)` | `Semantic<E>` | ์ธ๋ฑ์Šค ๋ณ€ํ™˜ | O(n) |
170
+ | `translate(translator)` | `Semantic<E>` | ์‚ฌ์šฉ์ž ์ •์˜ ์ธ๋ฑ์Šค ๋ณ€ํ™˜ | O(n) |
171
+
172
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
173
+ ```typescript
174
+ import { from } from 'semantic-typescript';
135
175
 
136
- ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ **๋‹จ์ผ ๊ฐ’ ๋˜๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ์ถ•์•ฝ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
176
+ const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
137
177
 
138
- ๋‚ด์žฅ๋œ ์ •์  ํŒฉํ† ๋ฆฌ:
178
+ // ์ŠคํŠธ๋ฆผ ๋ณ€ํ™˜ ์—ฐ์‚ฐ ์˜ˆ์‹œ
179
+ const processedStream = stream
180
+ .filter(x => x % 2 === 0) // ์ง์ˆ˜ ํ•„ํ„ฐ๋ง
181
+ .map(x => x * 2) // ๊ฐ ์š”์†Œ์— 2 ๊ณฑํ•˜๊ธฐ
182
+ .distinct() // ์ค‘๋ณต ์ œ๊ฑฐ
183
+ .limit(3) // ์ฒ˜์Œ 3๊ฐœ ์š”์†Œ๋กœ ์ œํ•œ
184
+ .peek((val, index) => console.log(`์ธ๋ฑ์Šค ${index}์˜ ์š”์†Œ ${val}`)); // ์š”์†Œ ํ™•์ธ
139
185
 
140
- ```typescript
141
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
186
+ // ์ฐธ๊ณ : ์ŠคํŠธ๋ฆผ์€ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์Œ, ํ„ฐ๋ฏธ๋„ ์—ฐ์‚ฐ์„ ์œ„ํ•ด Collectable๋กœ ๋ณ€ํ™˜ ํ•„์š”
143
187
  ```
144
188
 
145
- ํ•˜์ง€๋งŒ ๋ณดํ†ต์€ `Collectable` ํด๋ž˜์Šค์˜ ๊ณ ์ˆ˜์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
146
-
147
- ---
189
+ #### ์ŠคํŠธ๋ฆผ ํ„ฐ๋ฏธ๋„ ์—ฐ์‚ฐ
148
190
 
149
- ### 6. `Collectable<E>` (์ถ”์ƒ ํด๋ž˜์Šค)
191
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ์„ฑ๋Šฅ ํŠน์„ฑ |
192
+ |------|----------|------|----------|
193
+ | `toOrdered()` | `OrderedCollectable<E>` | ์ •๋ ฌ๋œ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ | ์ •๋ ฌ ์—ฐ์‚ฐ, ๋‚ฎ์€ ์„ฑ๋Šฅ |
194
+ | `toUnordered()` | `UnorderedCollectable<E>` | ๋น„์ •๋ ฌ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ | ๊ฐ€์žฅ ๋น ๋ฆ„, ์ •๋ ฌ ์—†์Œ |
195
+ | `toWindow()` | `WindowCollectable<E>` | ์œˆ๋„์šฐ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ | ์ •๋ ฌ ์—ฐ์‚ฐ, ๋‚ฎ์€ ์„ฑ๋Šฅ |
196
+ | `toNumericStatistics()` | `Statistics<E, number>` | ์ˆซ์ž ํ†ต๊ณ„ ๋ถ„์„ | ์ •๋ ฌ ์—ฐ์‚ฐ, ๋‚ฎ์€ ์„ฑ๋Šฅ |
197
+ | `toBigintStatistics()` | `Statistics<E, bigint>` | Big integer ํ†ต๊ณ„ ๋ถ„์„ | ์ •๋ ฌ ์—ฐ์‚ฐ, ๋‚ฎ์€ ์„ฑ๋Šฅ |
198
+ | `sorted()` | `OrderedCollectable<E>` | ์ž์—ฐ ์ •๋ ฌ | ์žฌ์ง€์ • ๊ฒฐ๊ณผ ์žฌ์ •์˜ |
199
+ | `sorted(comparator)` | `OrderedCollectable<E>` | ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ | ์žฌ์ง€์ • ๊ฒฐ๊ณผ ์žฌ์ •์˜ |
150
200
 
151
- ๋‹ค์Œ ํด๋ž˜์Šค๋“ค์˜ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค:
152
-
153
- - `OrderedCollectable<E>` โ€” ์ •๋ ฌ๋œ ์ถœ๋ ฅ
154
- - `UnorderedCollectable<E>` โ€” ์ •๋ ฌ ์—†์Œ, ๊ฐ€์žฅ ๋น ๋ฆ„
155
- - `WindowCollectable<E>` โ€” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
156
- - `Statistics<E, D>` โ€” ํ†ต๊ณ„ ์ง‘๊ณ„
201
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
202
+ ```typescript
203
+ import { from } from 'semantic-typescript';
157
204
 
158
- #### ๊ณตํ†ต ๋ฉ”์„œ๋“œ (์ƒ์†์„ ํ†ตํ•ด):
205
+ const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
159
206
 
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)` |
207
+ // ์ •๋ ฌ๋œ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ (๋‚ฎ์€ ์„ฑ๋Šฅ)
208
+ const ordered = semanticStream.toOrdered();
170
209
 
171
- ---
210
+ // ๋น„์ •๋ ฌ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ (๊ฐ€์žฅ ๋น ๋ฆ„)
211
+ const unordered = semanticStream.toUnordered();
172
212
 
173
- ### 7. `OrderedCollectable<E>` โ€” ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ
213
+ // ์ž์—ฐ ์ •๋ ฌ
214
+ const sortedNatural = semanticStream.sorted();
174
215
 
175
- ์š”์†Œ๋“ค์„ **์ž๋™์œผ๋กœ ์ •๋ ฌ**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
216
+ // ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ
217
+ const sortedCustom = semanticStream.sorted((a, b) => b - a); // ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
176
218
 
177
- **์ปค์Šคํ…€ ๋น„๊ต์ž**๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ž์—ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
219
+ // ํ†ต๊ณ„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
220
+ const stats = semanticStream.toNumericStatistics();
178
221
 
179
- ```typescript
180
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
222
+ // ์ฐธ๊ณ : ์œ„ ๋ฉ”์„œ๋“œ๋“ค์€ Semantic ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜์—ฌ Collectable์„ ์–ป์€ ํ›„ ํ„ฐ๋ฏธ๋„ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ํ•„์š”
182
223
  ```
183
224
 
184
- ๐Ÿ”’ **์ •๋ ฌ๋œ ์ถœ๋ ฅ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.**
225
+ ### Collector<E, A, R> - ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ
185
226
 
186
- ---
227
+ ์ˆ˜์ง‘๊ธฐ๋Š” ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ตฌ์กฐ๋กœ ์ง‘๊ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
187
228
 
188
- ### 8. `UnorderedCollectable<E>` โ€” ์ •๋ ฌ ์—†์Œ (๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„)
189
-
190
- **์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
229
+ | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค |
230
+ |------|------|----------|
231
+ | `collect(generator)` | ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‹คํ–‰ | ์ŠคํŠธ๋ฆผ ํ„ฐ๋ฏธ๋„ ์—ฐ์‚ฐ |
232
+ | `static full(identity, accumulator, finisher)` | ์™„์ „ํ•œ ์ˆ˜์ง‘๊ธฐ ์ƒ์„ฑ | ์™„์ „ํ•œ ์ฒ˜๋ฆฌ ํ•„์š” |
233
+ | `static shortable(identity, interruptor, accumulator, finisher)` | ์ค‘๋‹จ ๊ฐ€๋Šฅ ์ˆ˜์ง‘๊ธฐ ์ƒ์„ฑ | ์กฐ๊ธฐ ์ข…๋ฃŒ ๊ฐ€๋Šฅ |
191
234
 
235
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
192
236
  ```typescript
193
- const unordered = new UnorderedCollectable(stream);
194
- // ๋˜๋Š”
195
- const fastest = semanticStream.toUnordered();
237
+ import { Collector } from 'semantic-typescript';
238
+
239
+ // ์‚ฌ์šฉ์ž ์ •์˜ ์ˆ˜์ง‘๊ธฐ ์ƒ์„ฑ
240
+ const sumCollector = Collector.full(
241
+ () => 0, // ์ดˆ๊ธฐ ๊ฐ’
242
+ (acc, value) => acc + value, // ๋ˆ„์‚ฐ๊ธฐ
243
+ result => result // ์™„๋ฃŒ ํ•จ์ˆ˜
244
+ );
245
+
246
+ // ์ˆ˜์ง‘๊ธฐ ์‚ฌ์šฉ (Semantic์—์„œ Collectable๋กœ ๋ณ€ํ™˜ ํ•„์š”)
247
+ const numbers = from([1, 2, 3, 4, 5]);
248
+ const sum = numbers.toUnordered().collect(sumCollector); // 15
196
249
  ```
197
250
 
198
- โœ… **์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ**
199
- โœ… **์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ**
200
-
201
- ---
251
+ ### Collectable<E> - ์ˆ˜์ง‘ ๊ฐ€๋Šฅ ๋ฐ์ดํ„ฐ ์ถ”์ƒ ํด๋ž˜์Šค
202
252
 
203
- ### 9. `Statistics<E, D>` โ€” ํ†ต๊ณ„ ๋ถ„์„
253
+ ํ’๋ถ€ํ•œ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ ๋ฐ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. **์ฐธ๊ณ : ๋ฐ˜๋“œ์‹œ Semantic ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด sorted(), toOrdered() ๋“ฑ์„ ๋จผ์ € ํ˜ธ์ถœํ•˜์—ฌ Collectable ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์€ ํ›„ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.**
204
254
 
205
- ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
255
+ #### ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ
206
256
 
207
- #### ์„œ๋ธŒ ํด๋ž˜์Šค:
257
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ์˜ˆ์‹œ |
258
+ |------|----------|------|------|
259
+ | `anyMatch(predicate)` | `boolean` | ์–ด๋–ค ์š”์†Œ๋ผ๋„ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ | `anyMatch(x => x > 0)` |
260
+ | `allMatch(predicate)` | `boolean` | ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ | `allMatch(x => x > 0)` |
261
+ | `count()` | `bigint` | ์š”์†Œ ์ˆ˜ ํ†ต๊ณ„ | `count()` โ†’ `5n` |
262
+ | `isEmpty()` | `boolean` | ์ŠคํŠธ๋ฆผ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ | `isEmpty()` |
263
+ | `findAny()` | `Optional<E>` | ์•„๋ฌด ์š”์†Œ ์ฐพ๊ธฐ | `findAny()` |
264
+ | `findFirst()` | `Optional<E>` | ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์ฐพ๊ธฐ | `findFirst>` |
265
+ | `findLast()` | `Optional<E>` | ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ฐพ๊ธฐ | `findLast>` |
208
266
 
209
- - `NumericStatistics<E>` โ€” `number` ๊ฐ’์šฉ
210
- - `BigIntStatistics<E>` โ€” `bigint` ๊ฐ’์šฉ
211
-
212
- ##### ์ฃผ์š” ํ†ต๊ณ„ ๋ฉ”์„œ๋“œ:
267
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
268
+ ```typescript
269
+ import { from } from 'semantic-typescript';
213
270
 
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()` |
271
+ const numbers = from([1, 2, 3, 4, 5]);
227
272
 
228
- ---
273
+ // ํ„ฐ๋ฏธ๋„ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์ „ ๋ฐ˜๋“œ์‹œ Collectable๋กœ ๋ณ€ํ™˜
274
+ const collectable = numbers.toUnordered();
229
275
 
230
- ## ๐Ÿงช ์ „์ฒด ์˜ˆ์ œ
276
+ // ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ
277
+ const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
+ const allPositive = collectable.allMatch(x => x > 0); // true
279
+ const count = collectable.count(); // 5n
280
+ const isEmpty = collectable.isEmpty(); // false
281
+ const firstElement = collectable.findFirst(); // Optional.of(1)
282
+ const anyElement = collectable.findAny(); // ์•„๋ฌด ์š”์†Œ
283
+ ```
231
284
 
285
+ #### ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ ์—ฐ์‚ฐ
286
+
287
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ๋ณต์žก๋„ |
288
+ |------|----------|------|--------|
289
+ | `group(classifier)` | `Map<K, E[]>` | ๋ถ„๋ฅ˜์ž์— ๋”ฐ๋ฅธ ๊ทธ๋ฃนํ™” | O(n) |
290
+ | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | ํ‚ค-๊ฐ’ ์ถ”์ถœ๊ธฐ์— ๋”ฐ๋ฅธ ๊ทธ๋ฃนํ™” | O(n) |
291
+ | `join()` | `string` | ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉ | O(n) |
292
+ | `join(delimiter)` | `string` | ๊ตฌ๋ถ„์ž๋กœ ๊ฒฐํ•ฉ | O(n) |
293
+ | `partition(count)` | `E[][]` | ๊ฐœ์ˆ˜์— ๋”ฐ๋ฅธ ๋ถ„ํ•  | O(n) |
294
+ | `partitionBy(classifier)` | `E[][]` | ๋ถ„๋ฅ˜์ž์— ๋”ฐ๋ฅธ ๋ถ„ํ•  | O(n) |
295
+ | `reduce(accumulator)` | `Optional<E>` | ์ถ•์†Œ ์—ฐ์‚ฐ | O(n) |
296
+ | `reduce(identity, accumulator)` | `E` | ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•œ ์ถ•์†Œ | O(n) |
297
+ | `toArray()` | `E[]` | ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ | O(n) |
298
+ | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Map์œผ๋กœ ๋ณ€ํ™˜ | O(n) |
299
+ | `toSet()` | `Set<E>` | Set์œผ๋กœ ๋ณ€ํ™˜ | O(n) |
300
+
301
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
232
302
  ```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());
303
+ import { from } from 'semantic-typescript';
304
+
305
+ const people = from([
306
+ { name: "Alice", age: 25, city: "New York" },
307
+ { name: "Bob", age: 30, city: "London" },
308
+ { name: "Charlie", age: 25, city: "New York" }
309
+ ]);
310
+
311
+ // ์ง‘๊ณ„ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ „ ๋ฐ˜๋“œ์‹œ Collectable๋กœ ๋ณ€ํ™˜
312
+ const collectable = people.toUnordered();
313
+
314
+ // ๊ทธ๋ฃนํ™” ์—ฐ์‚ฐ
315
+ const byCity = collectable.group(person => person.city);
316
+ // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
317
+
318
+ const byAge = collectable.groupBy(
319
+ person => person.age,
320
+ person => person.name
321
+ );
322
+ // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
323
+
324
+ // ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜
325
+ const array = collectable.toArray(); // ์›๋ณธ ๋ฐฐ์—ด
326
+ const set = collectable.toSet(); // Set ์ปฌ๋ ‰์…˜
327
+ const map = collectable.toMap(
328
+ person => person.name,
329
+ person => person.age
330
+ ); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
331
+
332
+ // ์ถ•์†Œ ์—ฐ์‚ฐ
333
+ const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
334
+ const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
253
335
  ```
254
336
 
255
- ---
337
+ ### ํŠน์ • ์ˆ˜์ง‘๊ธฐ ๊ตฌํ˜„
256
338
 
257
- ## ๐Ÿ› ๏ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
339
+ #### UnorderedCollectable<E>
340
+ - **ํŠน์ง•**: ๊ฐ€์žฅ ๋น ๋ฅธ ์ˆ˜์ง‘๊ธฐ, ์ •๋ ฌ ์—†์Œ
341
+ - **์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค**: ์ˆœ์„œ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ, ์ตœ๋Œ€ ์„ฑ๋Šฅ ์›ํ•  ๋•Œ
342
+ - **๋ฉ”์„œ๋“œ**: ๋ชจ๋“  Collectable ๋ฉ”์„œ๋“œ ์ƒ์†
258
343
 
259
- ๋‹ค์–‘ํ•œ **ํƒ€์ž… ๊ฐ€๋“œ(Type Guards)** ์™€ **๋น„๊ต ๋„๊ตฌ**๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
344
+ #### OrderedCollectable<E>
345
+ - **ํŠน์ง•**: ์š”์†Œ ์ˆœ์„œ ๋ณด์žฅ, ๋‚ฎ์€ ์„ฑ๋Šฅ
346
+ - **์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค**: ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ ํ•„์š”
347
+ - **ํŠน๋ณ„ ๋ฉ”์„œ๋“œ**: ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ƒ์†, ๋‚ด๋ถ€ ์ •๋ ฌ ์ƒํƒœ ์œ ์ง€
260
348
 
261
- | ํ•จ์ˆ˜ | ์šฉ๋„ |
262
- |------|------|
263
- | `isString(x)` | `string` ํƒ€์ž… ๊ฐ€๋“œ |
264
- | `isNumber(x)` | `number` ํƒ€์ž… ๊ฐ€๋“œ |
265
- | `isBoolean(x)` | `boolean` ํƒ€์ž… ๊ฐ€๋“œ |
266
- | `isIterable(x)` | ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ |
267
- | `useCompare(a, b)` | ๋ฒ”์šฉ ๋น„๊ต ํ•จ์ˆ˜ |
268
- | `useRandom(x)` | ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ (์žฌ๋ฏธ์‚ผ์•„) |
349
+ #### WindowCollectable<E>
350
+ - **ํŠน์ง•**: ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์—ฐ์‚ฐ ์ง€์›
351
+ - **์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค**: ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๋ถ„์„
352
+ - **ํŠน๋ณ„ ๋ฉ”์„œ๋“œ**:
353
+ - `slide(size, step)` - ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
354
+ - `tumble(size)` - ํ…€๋ธ”๋ง ์œˆ๋„์šฐ
269
355
 
270
- ---
356
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
357
+ ```typescript
358
+ import { from } from 'semantic-typescript';
271
359
 
272
- ## ๐Ÿงฉ ๊ณ ๊ธ‰: ์ปค์Šคํ…€ ์ƒ์„ฑ๊ธฐ & ์œˆ๋„์šฐ
360
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
273
361
 
274
- ๋ฌดํ•œ ๋˜๋Š” ์ œ์–ด๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•œ **์ปค์Šคํ…€ ์ƒ์„ฑ๊ธฐ**๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
362
+ // ๋น„์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ (๊ฐ€์žฅ ๋น ๋ฆ„)
363
+ const unordered = data.toUnordered();
364
+ const unorderedArray = unordered.toArray(); // ์›๋ณธ ์ˆœ์„œ ์œ ์ง€ ๊ฐ€๋Šฅ [1, 2, 3, ...]
275
365
 
276
- ```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);
285
- ```
366
+ // ์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ
367
+ const ordered = data.toOrdered();
368
+ const orderedArray = ordered.toArray(); // ์ •๋ ฌ ๋ณด์žฅ [1, 2, 3, ...]
286
369
 
287
- ๋˜๋Š” **์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
370
+ // ์œˆ๋„์šฐ ์ˆ˜์ง‘๊ธฐ
371
+ const windowed = data.toWindow();
372
+ const slidingWindows = windowed.slide(3n, 2n); // ์œˆ๋„์šฐ ํฌ๊ธฐ 3, ๋‹จ๊ณ„ 2
373
+ // ์œˆ๋„์šฐ 1: [1, 2, 3], ์œˆ๋„์šฐ 2: [3, 4, 5], ์œˆ๋„์šฐ 3: [5, 6, 7], ...
288
374
 
289
- ```typescript
290
- const windowed = ordered.slide(3n, 2n); // ํฌ๊ธฐ 3, ์Šคํ… 2
375
+ const tumblingWindows = windowed.tumble(4n); // ํ…€๋ธ”๋ง ์œˆ๋„์šฐ ํฌ๊ธฐ 4
376
+ // ์œˆ๋„์šฐ 1: [1, 2, 3, 4], ์œˆ๋„์šฐ 2: [5, 6, 7, 8], ...
291
377
  ```
292
378
 
293
- ---
294
-
295
- ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค
296
-
297
- ์ด ํ”„๋กœ์ ํŠธ๋Š” **MIT ๋ผ์ด์„ ์Šค** ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ƒ์—…์ ยท๊ฐœ์ธ์  ์šฉ๋„๋กœ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
379
+ ### Statistics<E, D> - ํ†ต๊ณ„ ๋ถ„์„
380
+
381
+ ํ†ต๊ณ„ ๋ถ„์„ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ํ’๋ถ€ํ•œ ํ†ต๊ณ„ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. **์ฐธ๊ณ : ๋ฐ˜๋“œ์‹œ Semantic ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด toNumericStatistics() ๋˜๋Š” toBigIntStatistics()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Statistics ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์€ ํ›„ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.**
382
+
383
+ #### ํ†ต๊ณ„ ๊ณ„์‚ฐ ์—ฐ์‚ฐ
384
+
385
+ | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ ํƒ€์ž… | ์„ค๋ช… | ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„ |
386
+ |------|----------|------|------------|
387
+ | `maximum()` | `Optional<E>` | ์ตœ๋Œ€๊ฐ’ | O(n) |
388
+ | `minimum()` | `Optional<E>` | ์ตœ์†Œ๊ฐ’ | O(n) |
389
+ | `range()` | `D` | ๋ฒ”์œ„ (์ตœ๋Œ€-์ตœ์†Œ) | O(n) |
390
+ | `variance()` | `D` | ๋ถ„์‚ฐ | O(n) |
391
+ | `standardDeviation()` | `D` | ํ‘œ์ค€ ํŽธ์ฐจ | O(n) |
392
+ | `mean()` | `D` | ํ‰๊ท ๊ฐ’ | O(n) |
393
+ | `median()` | `D` | ์ค‘์•™๊ฐ’ | O(n log n) |
394
+ | `mode()` | `D` | ์ตœ๋นˆ๊ฐ’ | O(n) |
395
+ | `frequency()` | `Map<D, bigint>` | ๋นˆ๋„ ๋ถ„ํฌ | O(n) |
396
+ | `summate()` | `D` | ํ•ฉ๊ณ„ | O(n) |
397
+ | `quantile(quantile)` | `D` | ๋ถ„์œ„์ˆ˜ | O(n log n) |
398
+ | `interquartileRange()` | `D` | ์‚ฌ๋ถ„์œ„ ๋ฒ”์œ„ | O(n log n) |
399
+ | `skewness()` | `D` | ์™œ๋„ | O(n) |
400
+ | `kurtosis()` | `D` | ์ฒจ๋„ | O(n) |
401
+
402
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
403
+ ```typescript
404
+ import { from } from 'semantic-typescript';
405
+
406
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
407
+
408
+ // ํ†ต๊ณ„ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์ „ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณ„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
409
+ const stats = numbers.toNumericStatistics();
410
+
411
+ // ๊ธฐ๋ณธ ํ†ต๊ณ„
412
+ const count = stats.count(); // 10n
413
+ const max = stats.maximum(); // Optional.of(10)
414
+ const min = stats.minimum(); // Optional.of(1)
415
+ const range = stats.range(); // 9
416
+ const mean = stats.mean(); // 5.5
417
+ const median = stats.median(); // 5.5
418
+ const sum = stats.summate(); // 55
419
+
420
+ // ๊ณ ๊ธ‰ ํ†ต๊ณ„
421
+ const variance = stats.variance(); // 8.25
422
+ const stdDev = stats.standardDeviation(); // 2.872
423
+ const mode = stats.mode(); // ์–ด๋–ค ๊ฐ’ (๋ชจ๋‘ ํ•œ ๋ฒˆ์”ฉ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ)
424
+ const q1 = stats.quantile(0.25); // 3.25
425
+ const q3 = stats.quantile(0.75); // 7.75
426
+ const iqr = stats.interquartileRange(); // 4.5
427
+
428
+ // ๋นˆ๋„ ๋ถ„ํฌ
429
+ const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
430
+ ```
298
431
 
299
- ---
432
+ #### ํŠน์ • ํ†ต๊ณ„ ๊ตฌํ˜„ ํด๋ž˜์Šค
300
433
 
301
- ## ๐Ÿ™Œ ๊ธฐ์—ฌ
434
+ **NumericStatistics<E>**
435
+ - number ํƒ€์ž… ํ†ต๊ณ„ ๋ถ„์„ ์ฒ˜๋ฆฌ
436
+ - ๋ชจ๋“  ํ†ต๊ณ„ ๊ณ„์‚ฐ์ด number ํƒ€์ž… ๋ฐ˜ํ™˜
302
437
 
303
- Pull Request, ์ด์Šˆ(Issue), ์•„์ด๋””์–ด ์ œ์•ˆ ๋“ฑ ๋ชจ๋‘ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!
438
+ **BigIntStatistics<E>**
439
+ - bigint ํƒ€์ž… ํ†ต๊ณ„ ๋ถ„์„ ์ฒ˜๋ฆฌ
440
+ - ๋ชจ๋“  ํ†ต๊ณ„ ๊ณ„์‚ฐ์ด bigint ํƒ€์ž… ๋ฐ˜ํ™˜
304
441
 
305
- ---
442
+ **์ฝ”๋“œ ์˜ˆ์‹œ ๋ณด์ถฉ:**
443
+ ```typescript
444
+ import { from } from 'semantic-typescript';
306
445
 
307
- ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ์š”์•ฝ
446
+ // ์ˆซ์ž ํ†ต๊ณ„
447
+ const numberData = from([10, 20, 30, 40, 50]);
448
+ const numericStats = numberData.toNumericStatistics();
308
449
 
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()` ๋“ฑ |
450
+ console.log(numericStats.mean()); // 30
451
+ console.log(numericStats.summate()); // 150
318
452
 
319
- ---
453
+ // Big integer ํ†ต๊ณ„
454
+ const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
+ const bigintStats = bigintData.toBigIntStatistics();
320
456
 
321
- ## ๐Ÿ”— ๋งํฌ
457
+ console.log(bigintStats.mean()); // 300n
458
+ console.log(bigintStats.summate()); // 1500n
322
459
 
323
- - ๐Ÿ“ฆ npm: https://www.npmjs.com/package/semantic-typescript
324
- - ๐Ÿ™ GitHub: https://github.com/eloyhere/semantic-typescript
325
- - ๐Ÿ“˜ ๋ฌธ์„œ: ์†Œ์Šค ์ฝ”๋“œ / ํƒ€์ž… ์ •์˜ ์ฐธ์กฐ
460
+ // ๋งคํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ํ†ต๊ณ„
461
+ const objectData = from([
462
+ { value: 15 },
463
+ { value: 25 },
464
+ { value: 35 },
465
+ { value: 45 }
466
+ ]);
326
467
 
327
- ---
468
+ const objectStats = objectData.toNumericStatistics();
469
+ const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
+ const sumWithMapper = objectStats.summate(obj => obj.value); // 120
471
+ ```
328
472
 
329
- **TypeScript์—์„œ ํ•จ์ˆ˜ํ˜•, ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ฆ๊ฒจ๋ณด์„ธ์š”.** ๐Ÿš€
473
+ ## ์™„์ „ํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ
330
474
 
331
- ---
475
+ ```typescript
476
+ import { from, validate, invalidate } from 'semantic-typescript';
477
+
478
+ // 1. ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
479
+ const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
480
+ const semanticStream = from(rawData);
481
+
482
+ // 2. ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ
483
+ const processedStream = semanticStream
484
+ .filter(val => validate(val)) // null ๋ฐ undefined ํ•„ํ„ฐ๋ง
485
+ .map(val => val! * 2) // ๊ฐ ๊ฐ’์— 2 ๊ณฑํ•˜๊ธฐ (validate๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ ! ์‚ฌ์šฉ)
486
+ .distinct(); // ์ค‘๋ณต ์ œ๊ฑฐ
487
+
488
+ // 3. Collectable๋กœ ๋ณ€ํ™˜ ๋ฐ ํ„ฐ๋ฏธ๋„ ์—ฐ์‚ฐ ์‚ฌ์šฉ
489
+ const collectable = processedStream.toUnordered();
490
+
491
+ // 4. ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ ์‚ฌ์šฉ
492
+ if (!collectable.isEmpty()) {
493
+ const results = collectable
494
+ .filter(x => x > 5) // ๋‹ค์‹œ ํ•„ํ„ฐ๋ง
495
+ .toArray(); // ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
496
+
497
+ console.log("์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ:", results); // [16, 18, 14, 8, 12]
498
+
499
+ // ํ†ต๊ณ„ ์ •๋ณด
500
+ const stats = processedStream.toNumericStatistics();
501
+ console.log("ํ‰๊ท ๊ฐ’:", stats.mean()); // 11.2
502
+ console.log("์ดํ•ฉ:", stats.summate()); // 56
503
+ }
504
+
505
+ // 5. ์ž ์žฌ์ ์œผ๋กœ ๋ฌดํšจํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
506
+ const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
+ const validData = potentiallyInvalidData.filter(validate);
508
+ const invalidData = potentiallyInvalidData.filter(invalidate);
509
+
510
+ console.log("์œ ํšจํ•œ ๋ฐ์ดํ„ฐ:", validData); // [1, 3, 4]
511
+ console.log("๋ฌดํšจํ•œ ๋ฐ์ดํ„ฐ:", invalidData); // [null, null]
512
+ ```
332
513
 
333
- โœ… **์ฐธ๊ณ :**
334
- - `toUnordered()` โ†’ **์ •๋ ฌ ์—†์Œ, ๊ฐ€์žฅ ๋น ๋ฆ„**
335
- - ๊ทธ ์™ธ (`sorted()`, `toOrdered()` ๋“ฑ) โ†’ **๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•จ**
514
+ ## ์ค‘์š”ํ•œ ์‚ฌ์šฉ ๊ทœ์น™ ์š”์•ฝ
515
+
516
+ 1. **์ŠคํŠธ๋ฆผ ์ƒ์„ฑ**: `from()`, `range()`, `fill()` ๋“ฑ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Semantic ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
517
+ 2. **์ŠคํŠธ๋ฆผ ๋ณ€ํ™˜**: Semantic ์ธ์Šคํ„ด์Šค์—์„œ `map()`, `filter()`, `distinct()` ๋“ฑ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
518
+ 3. **Collectable๋กœ ๋ณ€ํ™˜**: ๋ฐ˜๋“œ์‹œ Semantic ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ํ˜ธ์ถœ:
519
+ - `toOrdered()` - ์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ
520
+ - `toUnordered()` - ๋น„์ •๋ ฌ ์ˆ˜์ง‘๊ธฐ (๊ฐ€์žฅ ๋น ๋ฆ„)
521
+ - `toWindow()` - ์œˆ๋„์šฐ ์ˆ˜์ง‘๊ธฐ
522
+ - `toNumericStatistics()` - ์ˆซ์ž ํ†ต๊ณ„
523
+ - `toBigIntStatistics()` - Big integer ํ†ต๊ณ„
524
+ - `sorted()` - ์ž์—ฐ ์ •๋ ฌ
525
+ - `sorted(comparator)` - ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ
526
+ 4. **ํ„ฐ๋ฏธ๋„ ์—ฐ์‚ฐ**: Collectable ์ธ์Šคํ„ด์Šค์—์„œ `toArray()`, `count()`, `summate()` ๋“ฑ ํ„ฐ๋ฏธ๋„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
527
+ 5. **๋ฐ์ดํ„ฐ ๊ฒ€์ฆ**: `validate()`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ null/undefined๊ฐ€ ์•„๋‹˜์„ ๋ณด์žฅ, `invalidate()`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌดํšจํ•œ ๋ฐ์ดํ„ฐ ํ™•์ธ
528
+
529
+ ์ด ์„ค๊ณ„๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๋ณด์žฅํ•˜๋ฉด์„œ ํ’๋ถ€ํ•œ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.