semantic-typescript 0.0.1 โ†’ 0.0.3

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.jp.md ADDED
@@ -0,0 +1,335 @@
1
+ # ๐Ÿ“˜ semantic-typescript
2
+
3
+ TypeScript ใซใŠใ‘ใ‚‹**ๆ„ๅ‘ณ่ซ–็š„ใชใƒ‡ใƒผใ‚ฟๅ‡ฆ็†**ใฎใŸใ‚ใฎใ€ๅผทๅŠ›ใงๅž‹ๅฎ‰ๅ…จใชใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃใƒฉใ‚คใƒ–ใƒฉใƒชใงใ™ใ€‚
4
+ ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใ€ใ‚นใƒˆใƒชใƒผใƒ ใ€ใ‚ทใƒผใ‚ฑใƒณใ‚นใ‚’ๆ‰ฑใ†ใŸใ‚ใฎ้–ขๆ•ฐ็š„ใ‚นใ‚ฟใ‚คใƒซใฎๆง‹ๆˆ่ฆ็ด ใ‚’ๆไพ›ใ—ใ€ใ‚ฝใƒผใƒˆใ€ใƒ•ใ‚ฃใƒซใ‚ฟใƒชใƒณใ‚ฐใ€ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ€็ตฑ่จˆๅˆ†ๆžใชใฉใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ™ใ€‚
5
+
6
+ **้ †ๅบไป˜ใใพใŸใฏ้ †ๅบใชใ—ใฎใƒ‡ใƒผใ‚ฟ**ใ‚’ๅ‡ฆ็†ใ™ใ‚‹ๅ ดๅˆใงใ‚‚ใ€**็ตฑ่จˆๅˆ†ๆž**ใ‚’่กŒใ†ๅ ดๅˆใงใ‚‚ใ€ๅ˜ใซ**ๆผ”็ฎ—ใ‚’ๆตใ‚Œใ‚‹ใ‚ˆใ†ใซใƒใ‚งใƒผใƒณใ—ใŸใ„**ๅ ดๅˆใงใ‚‚ใ€ๆœฌใƒฉใ‚คใƒ–ใƒฉใƒชใŒๅฏพๅฟœใ—ใพใ™ใ€‚
7
+
8
+ ---
9
+
10
+ ## ๐Ÿงฉ ็‰นๅพด
11
+
12
+ - โœ… ๅ…จ้ข็š„ใซ**ๅž‹ๅฎ‰ๅ…จใชใ‚ธใ‚งใƒใƒชใ‚ฏใ‚น**
13
+ - โœ… **้–ขๆ•ฐๅž‹ใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ**ใ‚นใ‚ฟใ‚คใƒซ๏ผˆmapใ€filterใ€reduce ใชใฉ๏ผ‰
14
+ - โœ… **ๆ„ๅ‘ณ่ซ–็š„ใƒ‡ใƒผใ‚ฟใ‚นใƒˆใƒชใƒผใƒ **๏ผˆ`Semantic<E>`๏ผ‰ใซใ‚ˆใ‚‹้…ๅปถ่ฉ•ไพก
15
+ - โœ… ใ‚นใƒˆใƒชใƒผใƒ ใ‚’ๅ…ทไฝ“็š„ใชๆง‹้€ ใซๅค‰ๆ›ใ™ใ‚‹ใŸใ‚ใฎ**ใ‚ณใƒฌใ‚ฏใ‚ฟใƒผ**
16
+ - โœ… **้ †ๅบไป˜ใ๏ผ†้ †ๅบใชใ—ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณ** โ€” `toUnordered()` ใฏ**ๆœ€้€Ÿ**๏ผˆใ‚ฝใƒผใƒˆใชใ—๏ผ‰
17
+ - โœ… `sorted()`ใ€`toOrdered()`ใ€ๆฏ”่ผƒๅ™จใซใ‚ˆใ‚‹**ใ‚ฝใƒผใƒˆๆฉŸ่ƒฝ**
18
+ - โœ… **็ตฑ่จˆๅˆ†ๆž**๏ผˆ`Statistics`ใ€`NumericStatistics`ใ€`BigIntStatistics`๏ผ‰
19
+ - โœ… ๅฎ‰ๅ…จใช null ๅ€คๅ‡ฆ็†ใฎใŸใ‚ใฎ **`Optional<T>` ใƒขใƒŠใƒ‰**
20
+ - โœ… **ใ‚คใƒ†ใƒฌใƒผใ‚ฟใจใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผ**ใƒ™ใƒผใ‚นใฎ่จญ่จˆ โ€” ๅคง่ฆๆจกใƒป้žๅŒๆœŸใƒ‡ใƒผใ‚ฟใซใ‚‚้ฉๅฟœ
21
+
22
+ ---
23
+
24
+ ## ๐Ÿ“ฆ ใ‚คใƒณใ‚นใƒˆใƒผใƒซ
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
30
+ ---
31
+
32
+ ## ๐Ÿง  ใ‚ณใ‚ขๆฆ‚ๅฟต
33
+
34
+ ### 1. `Optional<T>` โ€“ ๅฎ‰ๅ…จใช null ๅ€คๅ‡ฆ็†
35
+
36
+ `null` ใพใŸใฏ `undefined` ใซใชใ‚Šๅพ—ใ‚‹ๅ€คใ‚’ๆ ผ็ดใ™ใ‚‹ใƒขใƒŠใƒ‡ใ‚ฃใƒƒใ‚ฏใ‚ณใƒณใƒ†ใƒŠใงใ™ใ€‚
37
+
38
+ #### ใƒกใ‚ฝใƒƒใƒ‰๏ผš
39
+
40
+ | ใƒกใ‚ฝใƒƒใƒ‰ | ่ชฌๆ˜Ž | ไพ‹ |
41
+ |----------|------|-----|
42
+ | `of(value)` | ๅ€คใ‚’ใƒฉใƒƒใƒ—๏ผˆnullish ใ‚‚ๅฏ๏ผ‰ | `Optional.of(null)` |
43
+ | `ofNullable(v)` | ใƒฉใƒƒใƒ—๏ผˆnullish ใ‚’่จฑๅฎน๏ผ‰ | `Optional.ofNullable(someVar)` |
44
+ | `ofNonNull(v)` | ใƒฉใƒƒใƒ—๏ผˆnull/undefined ใชใ‚‰ไพ‹ๅค–๏ผ‰ | `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()` |
52
+
53
+ #### ไพ‹๏ผš
54
+
55
+ ```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
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` โ€“ ้…ๅปถใƒ‡ใƒผใ‚ฟใ‚นใƒˆใƒชใƒผใƒ 
73
+
74
+ ่ฆ็ด ใฎ**้…ๅปถ่ฉ•ไพกๅฏ่ƒฝใชๅˆๆˆๅฏ่ƒฝใ‚ทใƒผใ‚ฑใƒณใ‚น**ใงใ™ใ€‚Java Streams ใ‚„ Kotlin Sequences ใฎใ‚ˆใ†ใช้–ขๆ•ฐ็š„ใ‚นใƒˆใƒชใƒผใƒ ใซไผผใฆใ„ใพใ™ใ€‚
75
+
76
+ `from()`ใ€`range()`ใ€`iterate()`ใ€`fill()` ใชใฉใฎใƒ˜ใƒซใƒ‘ใƒผใง `Semantic` ใ‚’ไฝœๆˆใงใใพใ™ใ€‚
77
+
78
+ #### ไฝœๆˆใƒกใ‚ฝใƒƒใƒ‰๏ผš
79
+
80
+ | ้–ขๆ•ฐ | ่ชฌๆ˜Ž | ไพ‹ |
81
+ |------|------|-----|
82
+ | `from(iterable)` | Array/Set/Iterable ใ‹ใ‚‰ไฝœๆˆ | `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
+ **้ †ๅบใ‚’ๅฟ…่ฆใจใ›ใš**ใ€**ๆœ€้ซ˜ใฎใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚น**ใ‚’ๆฑ‚ใ‚ใ‚‹ๅ ดๅˆใฏใ€ไปฅไธ‹ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„๏ผš
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ ๐Ÿ”ฅ **ใ‚ฝใƒผใƒˆใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฏ้ฉ็”จใ•ใ‚Œใพใ›ใ‚“ใ€‚**
116
+ ้ †ๅบใŒ้–ขไฟ‚ใชใใ€ๆœ€ๅคงใฎ้€ŸๅบฆใŒๅฟ…่ฆใชๅ ดๅˆใซ็†ๆƒณ็š„ใงใ™ใ€‚
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` ใŠใ‚ˆใณ `sorted()` โ€“ ใ‚ฝใƒผใƒˆๆธˆใฟๅ‡บๅŠ›
121
+
122
+ **ใ‚ฝใƒผใƒˆๆธˆใฟๅ‡บๅŠ›**ใŒๅฟ…่ฆใชๅ ดๅˆใฏใ€ไปฅไธ‹ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„๏ผš
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // ่‡ช็„ถ้ †
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // ใ‚ซใ‚นใ‚ฟใƒ ๆฏ”่ผƒๅ™จ
127
+ const orderedCollectable = semanticStream.toOrdered(); // ใ“ใกใ‚‰ใ‚‚ใ‚ฝใƒผใƒˆ
128
+ ```
129
+
130
+ โš ๏ธ ใ“ใ‚Œใ‚‰ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏใ€่‡ช็„ถ้ †ใพใŸใฏๆŒ‡ๅฎšใ•ใ‚ŒใŸๆฏ”่ผƒๅ™จใ‚’ไฝฟ็”จใ—ใฆ่ฆ็ด ใ‚’**ใ‚ฝใƒผใƒˆใ—ใพใ™**ใ€‚
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` โ€“ ใƒ‡ใƒผใ‚ฟ้›†็ด„
135
+
136
+ ใ‚ณใƒฌใ‚ฏใ‚ฟใƒผใซใ‚ˆใ‚Šใ€ใ‚นใƒˆใƒชใƒผใƒ ใ‚’**ๅ˜ไธ€ใพใŸใฏ่ค‡้›‘ใชๆง‹้€ ใซ็ธฎ็ด„**ใงใใพใ™ใ€‚
137
+
138
+ ็ต„ใฟ่พผใฟใฎ้™็š„ใƒ•ใ‚กใ‚ฏใƒˆใƒชใƒผ๏ผš
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
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
+ **ใ‚ซใ‚นใ‚ฟใƒ ๆฏ”่ผƒๅ™จ**ใ‚’ๅ—ใ‘ๅ…ฅใ‚Œใ‚‹ใ‹ใ€่‡ช็„ถ้ †ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ ๐Ÿ”’ **ใ‚ฝใƒผใƒˆๆธˆใฟๅ‡บๅŠ›ใŒไฟ่จผใ•ใ‚Œใพใ™ใ€‚**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` โ€“ ใ‚ฝใƒผใƒˆใชใ—๏ผˆ๐Ÿš€ ๆœ€้€Ÿ๏ผ‰
189
+
190
+ **้ †ๅบใ‚’ๅฟ…่ฆใจใ›ใš**ใ€**ๆœ€้ซ˜ใฎใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚น**ใ‚’ๆฑ‚ใ‚ใ‚‹ๅ ดๅˆใฏใ€ไปฅไธ‹ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„๏ผš
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // ใพใŸใฏ
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
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
+ ## ๐Ÿงช ๅฎŒๅ…จใชไพ‹
231
+
232
+ ```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());
253
+ ```
254
+
255
+ ---
256
+
257
+ ## ๐Ÿ› ๏ธ ใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ้–ขๆ•ฐ
258
+
259
+ ๆœฌใƒฉใ‚คใƒ–ใƒฉใƒชใฏๅคšๆ•ฐใฎ**ๅž‹ใ‚ฌใƒผใƒ‰**ใจ**ๆฏ”่ผƒใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ**ใ‚‚ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ—ใฆใ„ใพใ™๏ผš
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
+ ็„ก้™ใพใŸใฏๅˆถๅพกใ•ใ‚ŒใŸใƒ‡ใƒผใ‚ฟใ‚นใƒˆใƒชใƒผใƒ ็”จใฎใ‚ซใ‚นใ‚ฟใƒ **ใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผ**ใ‚’ไฝœๆˆใงใใพใ™๏ผš
275
+
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
+ ```
286
+
287
+ ใพใŸใฏ**ใ‚นใƒฉใ‚คใƒ‡ใ‚ฃใƒณใ‚ฐใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆ**ใ‚’ไฝฟ็”จ๏ผš
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // ใ‚ตใ‚คใ‚บ 3ใ€ใ‚นใƒ†ใƒƒใƒ— 2 ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆ
291
+ ```
292
+
293
+ ---
294
+
295
+ ## ๐Ÿ“„ ใƒฉใ‚คใ‚ปใƒณใ‚น
296
+
297
+ ๆœฌใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฏ **MIT ใƒฉใ‚คใ‚ปใƒณใ‚น**ใฎไธ‹ใงๅ…ฌ้–‹ใ•ใ‚ŒใฆใŠใ‚Šใ€ๅ•†็”จใŠใ‚ˆใณๅ€‹ไบบ็š„ๅˆฉ็”จใŒ่‡ช็”ฑใงใ™ใ€‚
298
+
299
+ ---
300
+
301
+ ## ๐Ÿ™Œ ่ฒข็Œฎ
302
+
303
+ ใƒ—ใƒซใƒชใ‚ฏใ‚จใ‚นใƒˆใ€ใ‚คใ‚ทใƒฅใƒผใ€ๆๆกˆใ‚’ๆญ“่ฟŽใ—ใพใ™๏ผ
304
+
305
+ ---
306
+
307
+ ## ๐Ÿš€ ใ‚ฏใ‚คใƒƒใ‚ฏใ‚นใ‚ฟใƒผใƒˆๆฆ‚่ฆ
308
+
309
+ | ใ‚ฟใ‚นใ‚ฏ | ใƒกใ‚ฝใƒƒใƒ‰ |
310
+ |-------|----------|
311
+ | null ใ‚’ๅฎ‰ๅ…จใซๅ‡ฆ็† | `Optional<T>` |
312
+ | ใ‚นใƒˆใƒชใƒผใƒ ใ‚’ไฝœๆˆ | `from([...])`ใ€`range()`ใ€`fill()` |
313
+ | ใƒ‡ใƒผใ‚ฟใ‚’ๅค‰ๆ› | `map()`ใ€`filter()` |
314
+ | ใƒ‡ใƒผใ‚ฟใ‚’ใ‚ฝใƒผใƒˆ | `sorted()`ใ€`toOrdered()` |
315
+ | ใ‚ฝใƒผใƒˆใชใ—๏ผˆๆœ€้€Ÿ๏ผ‰ | `toUnordered()` โœ… |
316
+ | ใ‚ฐใƒซใƒผใƒ—ๅŒ–๏ผ้›†็ด„ | `toMap()`ใ€`group()`ใ€`Collector` |
317
+ | ็ตฑ่จˆ | `NumericStatistics`ใ€`mean()`ใ€`median()` ใชใฉ |
318
+
319
+ ---
320
+
321
+ ## ๐Ÿ”— ใƒชใƒณใ‚ฏ
322
+
323
+ - ๐Ÿ“ฆ npm: https://www.npmjs.com/package/semantic-typescript
324
+ - ๐Ÿ™ GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - ๐Ÿ“˜ ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ: ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰๏ผๅž‹ๅฎš็พฉใ‚’ๅ‚็…ง
326
+
327
+ ---
328
+
329
+ **TypeScript ใงใฎๅˆๆˆๅฏ่ƒฝใงๅž‹ๅฎ‰ๅ…จใ€้–ขๆ•ฐ็š„ใชใƒ‡ใƒผใ‚ฟๅ‡ฆ็†ใ‚’ใŠๆฅฝใ—ใฟใใ ใ•ใ„ใ€‚** ๐Ÿš€
330
+
331
+ ---
332
+
333
+ โœ… **่ฆšใˆใฆใŠใ„ใฆใใ ใ•ใ„๏ผš**
334
+ - `toUnordered()` โ†’ **ใ‚ฝใƒผใƒˆใชใ—ใ€ๆœ€้€Ÿ**
335
+ - ใใฎไป–ใ™ในใฆ๏ผˆไพ‹: `sorted()`ใ€`toOrdered()`๏ผ‰โ†’ **ใƒ‡ใƒผใ‚ฟใ‚’ใ‚ฝใƒผใƒˆ**
package/readme.kr.md ADDED
@@ -0,0 +1,335 @@
1
+ # ๐Ÿ“˜ semantic-typescript
2
+
3
+ TypeScript์—์„œ **์˜๋ฏธ๋ก ์  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ(Semantic Data Processing)** ๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
4
+ ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ, ์‹œํ€€์Šค๋ฅผ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ •๋ ฌ, ํ•„ํ„ฐ๋ง, ๊ทธ๋ฃนํ™”, ํ†ต๊ณ„ ๋ถ„์„ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
5
+
6
+ **์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋“  ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋“ **, **ํ†ต๊ณ„ ๋ถ„์„์„ ํ•˜๋“ **, ํ˜น์€ ๋‹จ์ˆœํžˆ **์—ฐ์‚ฐ์„ ์œ ์ฐฝํ•˜๊ฒŒ ์—ฐ๊ฒฐ(chain)ํ•˜๊ณ  ์‹ถ๋“ **, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„์™€๋“œ๋ฆฝ๋‹ˆ๋‹ค.
7
+
8
+ ---
9
+
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
+ ## ๐Ÿ“ฆ ์„ค์น˜
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
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()` |
52
+
53
+ #### ์˜ˆ์ œ:
54
+
55
+ ```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
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` โ€” ์ง€์—ฐ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
73
+
74
+ ์š”์†Œ๋“ค์˜ **์ง€์—ฐ ํ‰๊ฐ€(Lazy), ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค**์ž…๋‹ˆ๋‹ค. Java์˜ Streams๋‚˜ Kotlin์˜ Sequences์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
75
+
76
+ `from()`, `range()`, `iterate()`, `fill()` ๊ฐ™์€ ํ—ฌํผ ํ•จ์ˆ˜๋กœ `Semantic` ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
77
+
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
+ **์ •๋ ฌ์ด ํ•„์š” ์—†๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด** ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์„ธ์š”:
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ ๐Ÿ”ฅ **์–ด๋– ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
116
+ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์†๋„๊ฐ€ ์ตœ์šฐ์„ ์ผ ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` ๋ฐ `sorted()` โ€” ์ •๋ ฌ๋œ ์ถœ๋ ฅ
121
+
122
+ **์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // ์ž์—ฐ ์ •๋ ฌ
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // ์ปค์Šคํ…€ ๋น„๊ต์ž
127
+ const orderedCollectable = semanticStream.toOrdered(); // ์ •๋ ฌ๋จ
128
+ ```
129
+
130
+ โš ๏ธ ์ด ๋ฉ”์„œ๋“œ๋“ค์€ **์š”์†Œ๋ฅผ ์ •๋ ฌ**ํ•˜๋ฉฐ, ์ž์—ฐ ์ •๋ ฌ ๋˜๋Š” ์ œ๊ณต๋œ ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` โ€” ๋ฐ์ดํ„ฐ ์ง‘๊ณ„
135
+
136
+ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ **๋‹จ์ผ ๊ฐ’ ๋˜๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ์ถ•์•ฝ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
137
+
138
+ ๋‚ด์žฅ๋œ ์ •์  ํŒฉํ† ๋ฆฌ:
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
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
+ **์ปค์Šคํ…€ ๋น„๊ต์ž**๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ž์—ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ ๐Ÿ”’ **์ •๋ ฌ๋œ ์ถœ๋ ฅ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` โ€” ์ •๋ ฌ ์—†์Œ (๐Ÿš€ ๊ฐ€์žฅ ๋น ๋ฆ„)
189
+
190
+ **์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ** ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // ๋˜๋Š”
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
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
+ ## ๐Ÿงช ์ „์ฒด ์˜ˆ์ œ
231
+
232
+ ```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());
253
+ ```
254
+
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
+ ๋ฌดํ•œ ๋˜๋Š” ์ œ์–ด๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•œ **์ปค์Šคํ…€ ์ƒ์„ฑ๊ธฐ**๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
275
+
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
+ ```
286
+
287
+ ๋˜๋Š” **์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // ํฌ๊ธฐ 3, ์Šคํ… 2
291
+ ```
292
+
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()` ๋“ฑ |
318
+
319
+ ---
320
+
321
+ ## ๐Ÿ”— ๋งํฌ
322
+
323
+ - ๐Ÿ“ฆ npm: https://www.npmjs.com/package/semantic-typescript
324
+ - ๐Ÿ™ GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - ๐Ÿ“˜ ๋ฌธ์„œ: ์†Œ์Šค ์ฝ”๋“œ / ํƒ€์ž… ์ •์˜ ์ฐธ์กฐ
326
+
327
+ ---
328
+
329
+ **TypeScript์—์„œ ํ•จ์ˆ˜ํ˜•, ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ฆ๊ฒจ๋ณด์„ธ์š”.** ๐Ÿš€
330
+
331
+ ---
332
+
333
+ โœ… **์ฐธ๊ณ :**
334
+ - `toUnordered()` โ†’ **์ •๋ ฌ ์—†์Œ, ๊ฐ€์žฅ ๋น ๋ฆ„**
335
+ - ๊ทธ ์™ธ (`sorted()`, `toOrdered()` ๋“ฑ) โ†’ **๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•จ**