semantic-typescript 0.2.6 → 0.2.7

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,10 +1,10 @@
1
- # Semantic-TypeScript 스트림 처리 라이브러리
1
+ # 시맨틱 타입스크립트 스트림 처리 라이브러리
2
2
 
3
3
  ## 소개
4
4
 
5
- Semantic-TypeScript는 JavaScript GeneratorFunction, Java Stream MySQL Index에서 영감을 받은 현대적인 스트림 처리 라이브러리입니다. 라이브러리의 핵심 설계는 데이터 인덱스를 기반으로 효율적인 데이터 처리 파이프라인을 구축하여 프론트엔드 개발자에게 타입 안전성과 함수형 스타일의 스트림 조작 경험을 제공합니다.
5
+ 시맨틱 타입스크립트는 자바스크립트의 제너레이터 함수, 자바 스트림, 그리고 MySQL 인덱스에서 영감을 받은 현대적인 스트림 처리 라이브러리입니다. 핵심 설계 철학은 데이터 인덱싱을 사용하여 효율적인 데이터 처리 파이프라인을 구축하는 것에 기반을 두고 있으며, 프론트엔드 개발을 위한 타입 안전하고 함수형 스타일의 스트리밍 작업 경험을 제공합니다.
6
6
 
7
- 기존의 동기식 처리와 달리 Semantic은 비동기 처리 모드를 채택합니다. 데이터 스트림을 생성할 때, 터미널이 데이터를 수신하는 시점은 업스트림이 `accept` `interrupt` 콜백 함수를 언제 호출하는지에 전적으로 의존합니다. 설계는 라이브러리가 실시간 데이터 스트림, 대규모 데이터 세트 및 비동기 데이터 소스를 우아하게 처리할 수 있도록 합니다.
7
+ 전통적인 동기 처리와 달리, 시맨틱은 비동기 처리 모델을 사용합니다. 데이터 스트림을 생성할 때, 터미널이 데이터를 수신하는 시간은 업스트림이 `accept`와 `interrupt` 콜백 함수를 호출하는 시점에 전적으로 의존합니다. 이러한 디자인은 라이브러리가 실시간 데이터 스트림, 대규모 데이터 세트 및 비동기 데이터 소스를 우아하게 처리할 수 있게 해줍니다.
8
8
 
9
9
  ## 설치
10
10
 
@@ -16,11 +16,11 @@ npm install semantic-typescript
16
16
 
17
17
  | 타입 | 설명 |
18
18
  |------|-------------|
19
- | `Invalid<T>` | `null` 또는 `undefined`를 확장하는 타입 |
20
- | `Valid<T>` | `null` `undefined`를 제외한 타입 |
21
- | `MaybeInvalid<T>` | `null` 또는 `undefined`가 수 있는 타입 |
22
- | `Primitive` | 원시 타입들의 집합 |
23
- | `MaybePrimitive<T>` | 원시 타입이 수 있는 타입 |
19
+ | `Invalid<T>` | `null` 또는 `undefined`에서 확장된 타입 |
20
+ | `Valid<T>` | `null`과 `undefined`를 제외한 타입 |
21
+ | `MaybeInvalid<T>` | `null` 또는 `undefined`일 수 있는 타입 |
22
+ | `Primitive` | 기본 타입의 집합 |
23
+ | `MaybePrimitive<T>` | 기본 타입일 수 있는 타입 |
24
24
  | `OptionalSymbol` | `Optional` 클래스의 심볼 식별자 |
25
25
  | `SemanticSymbol` | `Semantic` 클래스의 심볼 식별자 |
26
26
  | `CollectorsSymbol` | `Collector` 클래스의 심볼 식별자 |
@@ -32,67 +32,76 @@ npm install semantic-typescript
32
32
  | `BigIntStatisticsSymbol` | `BigIntStatistics` 클래스의 심볼 식별자 |
33
33
  | `UnorderedCollectableSymbol` | `UnorderedCollectable` 클래스의 심볼 식별자 |
34
34
 
35
- ## 함수형 인터페이스
35
+ ## 함수 지향 인터페이스
36
36
 
37
37
  | 인터페이스 | 설명 |
38
38
  |-----------|-------------|
39
- | `Runnable` | 매개변수 없고 반환값도 없는 함수 |
40
- | `Supplier<R>` | 매개변수 없이 `R`을 반환하는 함수 |
39
+ | `Runnable` | 매개변수가 없고 반환값도 없는 함수 |
40
+ | `Supplier<R>` | 매개변수가 없고 `R`을 반환하는 함수 |
41
41
  | `Functional<T, R>` | 단일 매개변수 변환 함수 |
42
- | `BiFunctional<T, U, R>` | 두 매개변수 변환 함수 |
43
- | `TriFunctional<T, U, V, R>` | 세 매개변수 변환 함수 |
42
+ | `BiFunctional<T, U, R>` | 두 개의 매개변수 변환 함수 |
43
+ | `TriFunctional<T, U, V, R>` | 세 개의 매개변수 변환 함수 |
44
44
  | `Predicate<T>` | 단일 매개변수 조건 함수 |
45
- | `BiPredicate<T, U>` | 두 매개변수 조건 함수 |
46
- | `TriPredicate<T, U, V>` | 세 매개변수 조건 함수 |
47
- | `Consumer<T>` | 단일 매개변수 소비 함수 |
48
- | `BiConsumer<T, U>` | 두 매개변수 소비 함수 |
49
- | `TriConsumer<T, U, V>` | 세 매개변수 소비 함수 |
50
- | `Comparator<T>` | 두 매개변수 비교 함수 |
51
- | `Generator<T>` | 제너레이터 함수 (핵심 및 기반) |
45
+ | `BiPredicate<T, U>` | 두 개의 매개변수 조건 함수 |
46
+ | `TriPredicate<T, U, V>` | 세 개의 매개변수 조건 함수 |
47
+ | `Consumer<T>` | 단일 매개변수 소비자 함수 |
48
+ | `BiConsumer<T, U>` | 두 개의 매개변수 소비자 함수 |
49
+ | `TriConsumer<T, U, V>` | 세 개의 매개변수 소비자 함수 |
50
+ | `Comparator<T>` | 두 개의 매개변수 비교 함수 |
51
+ | `Generator<T>` | 생성자 함수(핵심 및 기반) |
52
52
 
53
53
  ```typescript
54
- // 타입 사용 예제
55
- const predicate: Predicate<number> = (n) => n > 0;
56
- const mapper: Functional<string, number> = (str) => str.length;
57
- const comparator: Comparator<number> = (a, b) => a - b;
54
+ // 타입 사용
55
+ let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
+ let mapper: Functional<string, number> = (text: string): number => text.length;
57
+ let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
58
  ```
59
59
 
60
60
  ## 타입 가드
61
61
 
62
62
  | 함수 | 설명 | 시간 복잡도 | 공간 복잡도 |
63
63
  |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | 값이 null 또는 undefined가 아님을 검증 | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 값이 null 또는 undefined임을 검증 | O(1) | O(1) |
66
- | `isBoolean(t: unknown): t is boolean` | 불리언 여부 확인 | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | 문자열 여부 확인 | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | 숫자 여부 확인 | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | 함수 여부 확인 | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | 객체 여부 확인 | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | 심볼 여부 확인 | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | BigInt 여부 확인 | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | 기본 타입 여부 확인 | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | 반복 가능 여부 확인 | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | Optional 인스턴스 여부 확인 | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | Semantic 인스턴스 여부 확인 | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collector 인스턴스 여부 확인 | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | Collectable 인스턴스 여부 확인 | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectable 인스턴스 여부 확인 | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectable 인스턴스 여부 확인 | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectable 인스턴스 여부 확인 | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statistics 인스턴스 여부 확인 | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatistics 인스턴스 여부 확인 | O(1) | O(1) |
84
- | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatistics 인스턴스 여부 확인 | O(1) | O(1) |
64
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | 값이 null이나 undefined가 아닌지 검증 | O(1) | O(1) |
65
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 값이 null이나 undefined인지 검증 | O(1) | O(1) |
66
+ | `isBoolean(t: unknown): t is boolean` | boolean인지 확인 | O(1) | O(1) |
67
+ | `isString(t: unknown): t is string` | 문자열인지 확인 | O(1) | O(1) |
68
+ | `isNumber(t: unknown): t is number` | 숫자인지 확인 | O(1) | O(1) |
69
+ | `isFunction(t: unknown): t is Function` | 함수인지 확인 | O(1) | O(1) |
70
+ | `isObject(t: unknown): t is object` | 객체인지 확인 | O(1) | O(1) |
71
+ | `isSymbol(t: unknown): t is symbol` | 심볼인지 확인 | O(1) | O(1) |
72
+ | `isBigint(t: unknown): t is bigint` | BigInt인지 확인 | O(1) | O(1) |
73
+ | `isPrimitive(t: unknown): t is Primitive` | 기본 타입인지 확인 | O(1) | O(1) |
74
+ | `isIterable(t: unknown): t is Iterable<unknown>` | 반복 가능한 객체인지 확인 | O(1) | O(1) |
75
+ | `isOptional(t: unknown): t is Optional<unknown>` | Optional 인스턴스인지 확인 | O(1) | O(1) |
76
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Semantic 인스턴스인지 확인 | O(1) | O(1) |
77
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collector 인스턴스인지 확인 | O(1) | O(1) |
78
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Collectable 인스턴스인지 확인 | O(1) | O(1) |
79
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectable 인스턴스인지 확인 | O(1) | O(1) |
80
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectable 인스턴스인지 확인 | O(1) | O(1) |
81
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectable 인스턴스인지 확인 | O(1) | O(1) |
82
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statistics 인스턴스인지 확인 | O(1) | O(1) |
83
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatistics 인스턴스인지 확인 | O(1) | O(1) |
84
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatistics 인스턴스인지 확인 | O(1) | O(1) |
85
+ | `isPromise(t: unknown): t is Promise<unknown>` | Promise 객체인지 확인 | O(1) | O(1) |
86
+ | `isAsync(t: unknown): t is AsyncFunction` | AsyncFunction인지 확인 | O(1) | O(1) |
85
87
 
86
88
  ```typescript
87
- // 타입 가드 사용 예제
88
- const value: unknown = "hello";
89
+ // 타입 가드 사용
90
+ let value: unknown = "hello";
89
91
 
90
92
  if (isString(value)) {
91
- console.log(value.length); // 타입 안전, value는 string으로 추론
93
+ console.log(value.length); // 타입 안전, value는 문자열로 추론됩니다.
92
94
  }
93
95
 
94
96
  if (isOptional(someValue)) {
95
- someValue.ifPresent(val => console.log(val));
97
+ someValue.ifPresent((value): void => console.log(val));
98
+ }
99
+
100
+ if(isIterable(value)){
101
+ // 타입 안전, 이제 반복 가능한 객체입니다.
102
+ for(let item of value){
103
+ console.log(item);
104
+ }
96
105
  }
97
106
  ```
98
107
 
@@ -100,373 +109,370 @@ if (isOptional(someValue)) {
100
109
 
101
110
  | 함수 | 설명 | 시간 복잡도 | 공간 복잡도 |
102
111
  |------|------|------------|------------|
103
- | `useCompare<T>(t1: T, t2: T): number` | 범용 비교 함수 | O(1) | O(1) |
112
+ | `useCompare<T>(t1: T, t2: T): number` | 일반 비교 함수 | O(1) | O(1) |
104
113
  | `useRandom<T = number \| bigint>(index: T): T` | 의사 난수 생성기 | O(log n) | O(1) |
105
114
 
106
115
  ```typescript
107
- // 유틸리티 함수 사용 예제
108
- const numbers = [3, 1, 4, 1, 5];
116
+ // 유틸리티 함수 사용
117
+ let numbers: Array<number> = [3, 1, 4, 1, 5];
109
118
  numbers.sort(useCompare); // [1, 1, 3, 4, 5]
110
119
 
111
- const randomNum = useRandom(42); // 시드 기반 난수
112
- const randomBigInt = useRandom(1000n); // BigInt 난수
120
+ let randomNum = useRandom(42); // 시드 기반 난수
113
121
  ```
114
122
 
115
- ## 팩토리 메서드
123
+ ## 팩토리 메소드
116
124
 
117
- ### Optional 팩토리 메서드
125
+ ### 옵셔널 팩토리 메소드
118
126
 
119
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
120
- |--------|------|------------|------------|
121
- | `Optional.empty<T>()` | 빈 Optional 생성 | O(1) | O(1) |
122
- | `Optional.of<T>(value)` | 값을 가진 Optional 생성 | O(1) | O(1) |
123
- | `Optional.ofNullable<T>(value)` | null 허용 Optional 생성 | O(1) | O(1) |
124
- | `Optional.ofNonNull<T>(value)` | null이 아닌 Optional 생성 | O(1) | O(1) |
127
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
128
+ |------|------|------------|------------|
129
+ | `Optional.empty<T>()` | 빈 옵셔널을 생성 | O(1) | O(1) |
130
+ | `Optional.of<T>(value)` | 값을 포함하는 옵셔널을 생성 | O(1) | O(1) |
131
+ | `Optional.ofNullable<T>(value)` | 비어있을 있는 옵셔널을 생성 | O(1) | O(1) |
132
+ | `Optional.ofNonNull<T>(value)` | 비어있지 않은 옵셔널을 생성 | O(1) | O(1) |
125
133
 
126
134
  ```typescript
127
- // Optional 사용 예제
128
- const emptyOpt = Optional.empty<number>();
129
- const presentOpt = Optional.of(42);
130
- const nullableOpt = Optional.ofNullable<string>(null);
131
- const nonNullOpt = Optional.ofNonNull("hello");
132
-
133
- presentOpt.ifPresent(val => console.log(val)); // 42 출력
134
- console.log(emptyOpt.orElse(100)); // 100 출력
135
+ // 옵셔널 사용
136
+ let empty: Optional<number> = Optional.empty();
137
+ let present: Optional<number> = Optional.of(42);
138
+ let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
+ let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
+
141
+ present.ifPresent((val: number): void => console.log(val)); // 42 출력
142
+ console.log(emptyOpt.get(100)); // 100 출력
135
143
  ```
136
144
 
137
- ### Collector 팩토리 메서드
145
+ ### 컬렉터 팩토리 메소드
138
146
 
139
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
140
- |--------|------|------------|------------|
141
- | `Collector.full(identity, accumulator, finisher)` | 완전한 수집기 생성 | O(1) | O(1) |
142
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 중단 가능한 수집기 생성 | O(1) | O(1) |
147
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
148
+ |------|------|------------|------------|
149
+ | `Collector.full(identity, accumulator, finisher)` | 완전한 컬렉터를 생성 | O(1) | O(1) |
150
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 중단 가능한 컬렉터를 생성 | O(1) | O(1) |
143
151
 
144
152
  ```typescript
145
- // 컬렉터 변환 예제
146
- const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
153
+ // 컬렉터 변환
154
+ let numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
147
155
 
148
- // 성능 우선: 비정렬 컬렉터 사용
149
- const unordered = numbers
150
- .filter(n => n > 3)
151
- .toUnoredered();
156
+ // 성능 우선: 순서가 보장되지 않는 컬렉터 사용
157
+ let unordered = numbers
158
+ .filter((n: number): boolean => n > 3)
159
+ .toUnordered(); // 최고의 성능
152
160
 
153
- // 정렬 필요: 정렬 컬렉터 사용
154
- const ordered = numbers.sorted();
161
+ // 정렬 필요: 순서가 보장되는 컬렉터 사용
162
+ let ordered = numbers.sorted();
155
163
 
156
- // 요소 개수 세기
164
+ // 요소 계산
157
165
  let count = Collector.full(
158
- () => 0, // 초기값
159
- (accumulator, element) => accumulator + element, // 누적
160
- (accumulator) => accumulator // 완료
166
+ (): number => 0, // 초기값
167
+ (accumulator: number, element: number): number => accumulator + element, // 누적
168
+ (accumulator: number): number => accumulator // 완료
161
169
  );
162
170
  count.collect(from([1,2,3,4,5])); // 스트림에서 카운트
163
- count.collect([1,2,3,4,5]); // 이터러블 객체에서 카운트
171
+ count.collect([1,2,3,4,5]); // 반복 가능한 객체에서 카운트
164
172
 
165
173
  let find = Collector.shortable(
166
- () => Optional.empty(), // 초기값
167
- (element, index, accumulator) => accumulator.isPresent(), // 중단
168
- (accumulator, element, index) => Optional.of(element), // 누적
169
- (accumulator) => accumulator // 완료
174
+ (): Optional<number> => Optional.empty(), // 초기값
175
+ (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 중단
176
+ (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 누적
177
+ (accumulator: Optional<number>): Optional<number> => accumulator // 완료
170
178
  );
171
179
  find.collect(from([1,2,3,4,5])); // 첫 번째 요소 찾기
172
180
  find.collect([1,2,3,4,5]); // 첫 번째 요소 찾기
173
181
  ```
174
182
 
175
- ### Semantic 팩토리 메서드
183
+ ### 시맨틱 팩토리 메소드
176
184
 
177
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
178
- |-------|------|-------------|-------------|
179
- | `blob(blob, chunkSize)` | Blob으로부터 스트림 생성 | O(n) | O(chunkSize) |
180
- | `empty<E>()` | 스트림 생성 | O(1) | O(1) |
181
- | `fill<E>(element, count)` | 채워진 스트림 생성 | O(n) | O(1) |
182
- | `from<E>(iterable)` | 반복 가능 객체로부터 스트림 생성 | O(1) | O(1) |
183
- | `generate<E>(element, interrupt)` | 생성기를 사용한 스트림 생성 | O(1) | O(1) |
184
- | `interval(period, delay?)` | 정기적 간격 스트림 생성 | O(1)* | O(1) |
185
- | `iterate<E>(generator)` | 생성기로부터 스트림 생성 | O(1) | O(1) |
186
- | `range(start, end, step)` | 숫자 범위 스트림 생성 | O(n) | O(1) |
187
- | `websocket(websocket)` | WebSocket으로부터 스트림 생성 | O(1) | O(1) |
185
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
186
+ |------|------|------------|------------|
187
+ | `animationFrame(period: number, delay: number = 0)` | 시간 기반 애니메이션 프레임 스트림을 생성 | O(1)* | O(1) |
188
+ | `blob(blob, chunkSize)` | Blob에서 스트림을 생성 | O(n) | O(chunkSize) |
189
+ | `empty<E>()` | 스트림을 생성 | O(1) | O(1) |
190
+ | `fill<E>(element, count)` | 채워진 스트림을 생성 | O(n) | O(1) |
191
+ | `from<E>(iterable)` | 반복 가능한 객체에서 스트림을 생성 | O(1) | O(1) |
192
+ | `interval(period, delay?)` | 시간 기반 인터벌 스트림을 생성 | O(1)* | O(1) |
193
+ | `iterate<E>(generator)` | 생성자에서 스트림을 생성 | O(1) | O(1) |
194
+ | `range(start, end, step)` | 숫자 범위 스트림을 생성 | O(n) | O(1) |
195
+ | `websocket(websocket)` | WebSocket에서 스트림을 생성 | O(1) | O(1) |
188
196
 
189
197
  ```typescript
190
- // Semantic 팩토리 메서드 사용 예시
198
+ // 시맨틱 팩토리 메소드 사용
191
199
 
192
- // Blob으로부터 스트림 생성 (청크 읽기)
200
+ // Blob에서 스트림을 생성(청크 읽기)
193
201
  blob(someBlob, 1024n)
194
- .toUnordered()
195
- .write(WritableStream)
196
- .then(callback) // 스트림 쓰기 성공
197
- .catch(writeFi); // 스트림 쓰기 실패
202
+ .toUnordered()
203
+ .write(WritableStream)
204
+ .then(callback) // 스트림 쓰기 성공
205
+ .catch(callback); // 스트림 쓰기 실패
198
206
 
199
- // 다른 스트림과 연결될 때까지 실행되지 않는 빈 스트림 생성
207
+ // 빈 스트림을 생성, 다른 스트림과 연결될 때까지 실행되지 않음
200
208
  empty<string>()
201
- .toUnordered()
202
- .join(); //[]
209
+ .toUnordered()
210
+ .join(); // []
203
211
 
204
- // 채워진 스트림 생성
212
+ // 채워진 스트림을 생성
205
213
  const filledStream = fill("hello", 3); // "hello", "hello", "hello"
206
214
 
207
- // 초기 지연 2초, 실행 주기 5초의 시계열 스트림 생성
208
- // 타이머 메커니즘으로 구현, 시스템 스케줄링 제한으로 인한 시간 변동 가능성 있음
215
+ // 초기 지연 2초, 실행 주기 5초의 시간 기반 스트림을 생성, 타이머 메커니즘에 기반하여 구현됩니다. 시스템 스케줄링의 정확도 제한으로 인해 시간 드리프트가 발생할 수 있습니다.
209
216
  const intervalStream = interval(5000, 2000);
210
217
 
211
- // 반복 가능 객체로부터 스트림 생성
218
+ // 반복 가능한 객체에서 스트림을 생성
212
219
  const numberStream = from([1, 2, 3, 4, 5]);
213
220
  const stringStream = from(new Set(["Alex", "Bob"]));
214
221
 
215
- // 범위 스트림 생성
222
+ // 숫자 범위 스트림을 생성
216
223
  const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
217
224
 
218
225
  // WebSocket 이벤트 스트림
219
226
  const ws = new WebSocket("ws://localhost:8080");
220
227
  websocket(ws)
221
- .filter((event)=> event.type === "message") // 메시지 이벤트만 모니터링
222
- .toUnordered() // 이벤트는 일반적으로 정렬되지 않음
223
- .forEach((event)=> receive(event)); // 메시지 수신
228
+ .filter((event): boolean => event.type === "message") // 메시지 이벤트만 듣기
229
+ .toUnordered() // 이벤트는 일반적으로 순서가 없음
230
+ .forEach((event): void => receive(event)); // 메시지 받기
224
231
  ```
225
232
 
226
- ## Semantic 클래스 메서드
227
-
228
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
229
- |--------|------|------------|------------|
230
- | `concat(other)` | 두 스트림 연결 | O(n) | O(1) |
231
- | `distinct()` | 중복 제거 | O(n) | O(n) |
232
- | `distinct(comparator)` | 비교기를 사용한 중복 제거 | O(n²) | O(n) |
233
- | `dropWhile(predicate)` | 조건을 만족하는 요소 버리기 | O(n) | O(1) |
234
- | `filter(predicate)` | 요소 필터링 | O(n) | O(1) |
235
- | `flat(mapper)` | 평면화 매핑 | O(n × m) | O(1) |
236
- | `flatMap(mapper)` | 새로운 타입으로 평면화 매핑 | O(n × m) | O(1) |
233
+ ## 시맨틱 클래스 메소드
234
+
235
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
236
+ |------|------|------------|------------|
237
+ | `concat(other)` | 두 개의 스트림을 연결 | O(n) | O(1) |
238
+ | `distinct()` | 중복을 제거 | O(n) | O(n) |
239
+ | `distinct(comparator)` | 비교자를 사용하여 중복을 제거 | O(n²) | O(n) |
240
+ | `dropWhile(predicate)` | 조건을 만족하는 요소를 버림 | O(n) | O(1) |
241
+ | `filter(predicate)` | 요소를 필터링 | O(n) | O(1) |
242
+ | `flat(mapper)` | 평탄화 | O(n × m) | O(1) |
243
+ | `flatMap(mapper)` | 새로운 타입으로 평탄화 | O(n × m) | O(1) |
237
244
  | `limit(n)` | 요소 수 제한 | O(n) | O(1) |
238
- | `map(mapper)` | 매핑 변환 | O(n) | O(1) |
239
- | `peek(consumer)` | 요소 검사 | O(n) | O(1) |
245
+ | `map(mapper)` | 변환 | O(n) | O(1) |
246
+ | `peek(consumer)` | 요소를 엿보기 | O(n) | O(1) |
240
247
  | `redirect(redirector)` | 인덱스 리디렉션 | O(n) | O(1) |
241
248
  | `reverse()` | 스트림 반전 | O(n) | O(1) |
242
- | `shuffle()` | 무작위 셔플 | O(n) | O(1) |
243
- | `shuffle(mapper)` | 매퍼를 사용한 셔플 | O(n) | O(1) |
249
+ | `shuffle()` | 무작위로 섞기 | O(n) | O(1) |
250
+ | `shuffle(mapper)` | 매퍼를 사용하여 섞기 | O(n) | O(1) |
244
251
  | `skip(n)` | 처음 n개 요소 건너뛰기 | O(n) | O(1) |
245
252
  | `sorted()` | 정렬 | O(n log n) | O(n) |
246
- | `sorted(comparator)` | 비교기를 사용한 정렬 | O(n log n) | O(n) |
247
- | `sub(start, end)` | 서브 스트림 가져오기 | O(n) | O(1) |
253
+ | `sorted(comparator)` | 비교자를 사용하여 정렬 | O(n log n) | O(n) |
254
+ | `sub(start, end)` | 서브스트림 가져오기 | O(n) | O(1) |
248
255
  | `takeWhile(predicate)` | 조건을 만족하는 요소 가져오기 | O(n) | O(1) |
249
256
  | `translate(offset)` | 인덱스 변환 | O(n) | O(1) |
250
- | `translate(translator)` | 변환기를 사용한 인덱스 변환 | O(n) | O(1) |
257
+ | `translate(translator)` | 변환자를 사용하여 인덱스 변환 | O(n) | O(1) |
251
258
 
252
259
  ```typescript
253
- // Semantic 작업 예제
260
+ // 시맨틱 작업
254
261
  const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
255
- .filter(n => n % 2 === 0) // 짝수 필터링
256
- .map(n => n * 2) // 2배 변환
257
- .skip(1) // 첫 번째 요소 건너뛰기
258
- .limit(3) // 3개 요소로 제한
259
- .toUnordered() // 비정렬 수집기로 변환
260
- .toArray(); // 배열로 변환
262
+ .filter((n: number): boolean => n % 2 === 0) // 짝수 필터링
263
+ .map((n: number): number => n * 2) // 2배
264
+ .skip(1) // 첫 번째 건너뛰기
265
+ .limit(3) // 3개 요소 제한
266
+ .toUnordered() // 순서가 보장되지 않는 컬렉터로 변환
267
+ .toArray(); // 배열로 변환
261
268
  // 결과: [8, 12, 20]
262
269
 
263
- // 복잡한 작업 예제
270
+ // 복잡한 작업
264
271
  const complexResult = range(1, 100, 1)
265
- .flatMap(n => from([n, n * 2])) // 각 요소를 2개 요소로 매핑
266
- .distinct() // 중복 제거
267
- .shuffle() // 무작위 셔플
268
- .takeWhile(n => n < 50) // 50 미만 요소 가져오기
269
- .toOrdered() // 정렬된 수집기로 변환
270
- .toArray(); // 배열로 변환
272
+ .flatMap((n: number): Semantics<number> => from([n, n * 2])) // 각 요소를 개로 매핑
273
+ .distinct() // 중복 제거
274
+ .shuffle() // 순서 섞기
275
+ .takeWhile((n: number): boolean => n < 50) // 50 미만 요소 가져오기
276
+ .toOrdered() // 순서가 보장되는 컬렉터로 변환
277
+ .toArray(); // 배열로 변환
271
278
  ```
272
279
 
273
- ## 意味論的変換メソッド
280
+ ## 시맨틱 변환 메소드
274
281
 
275
- | メソッド | 説明 | 時間計算量 | 空間計算量 |
282
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
276
283
  |------------|------------|------------|------------|
277
- | `sorted()` | 順序付きコレクターに変換 | O(n log n) | O(n) |
278
- | `toUnordered()` | 順序なしコレクターに変換 | O(1) | O(1) |
279
- | `toOrdered()` | 順序付きコレクターに変換 | O(1) | O(1) |
280
- | `toNumericStatistics()` | 数値統計に変換 | O(n) | O(1) |
281
- | `toBigintStatistics()` | bigint 統計に変換 | O(n) | O(1) |
282
- | `toWindow()` | ウィンドウコレクターに変換 | O(1) | O(1) |
283
- | `toCollectable()` | `UnorderdCollectable` に変換 | O(n) | O(1) |
284
- | `toCollectable(mapper)` | カスタムコレクターに変換 | O(n) | O(1) |
284
+ | `sorted()` | 순서가 보장되는 컬렉터로 변환 | O(n log n) | O(n) |
285
+ | `toUnordered()` | 순서가 보장되지 않는 컬렉터로 변환 | O(1) | O(1) |
286
+ | `toOrdered()` | 순서가 보장되는 컬렉터로 변환 | O(1) | O(1) |
287
+ | `toNumericStatistics()` | 숫자 통계로 변환 | O(n) | O(1) |
288
+ | `toBigintStatistics()` | BigInt 통계로 변환 | O(n) | O(1) |
289
+ | `toWindow()` | 윈도우 컬렉터로 변환 | O(1) | O(1) |
290
+ | `toCollectable()` | `UnorderdCollectable`로 변환 | O(n) | O(1) |
291
+ | `toCollectable(mapper)` | 커스텀 컬렉터로 변환 | O(n) | O(1) |
285
292
 
286
293
  ```typescript
287
- // 昇順ソート配列に変換
288
- from([6,4,3,5,2]) // ストリーム作成
289
- .sorted() // ストリームを昇順でソート
294
+ // 오름차순으로 정렬된 배열로 변환
295
+ from([6,4,3,5,2]) // 스트림 생성
296
+ .sorted() // 스트림을 오름차순으로 정렬
290
297
  .toArray(); // [2, 3, 4, 5, 6]
291
298
 
292
- // 降順ソート配列に変換
293
- from([6,4,3,5,2]) // ストリーム作成
294
- .soted((a, b) => b - a) // ストリームを降順でソート
299
+ // 내림차순으로 정렬된 배열로 변환
300
+ from([6,4,3,5,2]) // 스트림 생성
301
+ .soted((a: number, b: number): number => b - a) // 스트림을 내림차순으로 정렬
295
302
  .toArray(); // [6, 5, 4, 3, 2]
296
303
 
297
- // 反転配列へリダイレクト
304
+ // 역순의 배열로 리다이렉트
298
305
  from([6,4,3,5,2])
299
- .redirect((element, index) => -index) // 反転順にリダイレクト
300
- .toOrderd() // リダイレクト後の順序を保持
306
+ .redirect((element, index): bigint => -index) // 역순으로 리다이렉트
307
+ .toOrderd() // 리다이렉트된 순서 유지
301
308
  .toArray(); // [2, 5, 3, 4, 6]
302
309
 
303
- // 反転配列へのリダイレクトを無視
310
+ // 리다이렉션을 무시하고 역순의 배열을 얻음
304
311
  from([6,4,3,5,2])
305
- .redirect((element, index) => -index) // 反転順にリダイレクト
306
- .toUnorderd() // リダイレクト順を破棄。この操作は `redirect`、`reverse`、`shuffle`、`translate` を無視する
312
+ .redirect((element: number, index: bigint) => -index) // 역순으로 리다이렉트
313
+ .toUnorderd() // 리다이렉션된 순서 무시. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 무시합니다
307
314
  .toArray(); // [2, 5, 3, 4, 6]
308
315
 
309
- // ストリームを反転して配列化
316
+ // 스트림을 역순으로 배열로 변환
310
317
  from([6, 4, 3, 5, 2])
311
- .reverse() // ストリームを反転
312
- .toOrdered() // 反転順を保証
318
+ .reverse() // 스트림을 역순으로 함
319
+ .toOrdered() // 역순을 보장함
313
320
  .toArray(); // [2, 5, 3, 4, 6]
314
321
 
315
- // シャッフルしたストリームを上書きして配列化
322
+ // 섞인 스트림을 배열로 덮어쓰기
316
323
  from([6, 4, 3, 5, 2])
317
- .shuffle() // ストリームをシャッフル
318
- .sorted() // シャッフル順を上書き。この操作は `redirect`、`reverse`、`shuffle`、`translate` を上書きする
324
+ .shuffle() // 스트림을 섞음
325
+ .sorted() // 섞인 순서를 덮어씀. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 덮어씀
319
326
  .toArray(); // [2, 5, 3, 4, 6]
320
327
 
321
- // ウィンドウコレクターに変換
328
+ // 윈도우 컬렉터로 변환
322
329
  from([6, 4, 3, 5, 2]).toWindow();
323
330
 
324
- // 数値統計に変換
331
+ // 숫자 통계로 변환
325
332
  from([6, 4, 3, 5, 2]).toNumericStatistics();
326
333
 
327
- // bigint 統計に変換
334
+ // BigInt 통계로 변환
328
335
  from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
329
336
 
330
- // データ収集用のカスタムコレクターを定義
331
- let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
337
+ // 데이터 수집을 위한 커스텀 컬렉터 정의
338
+ let customizedCollector = from([1, 2, 3, 4, 5])
339
+ .toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
332
340
  ```
333
341
 
334
- ## Collectable 수집 메서드
342
+ ## Collectable 수집 메소드
335
343
 
336
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
337
- |--------|------|------------|------------|
338
- | `anyMatch(predicate)` | 일치하는 요소 존재 여부 확인 | O(n) | O(1) |
339
- | `allMatch(predicate)` | 모든 요소 일치 여부 확인 | O(n) | O(1) |
340
- | `count()` | 요소 개수 세기 | O(n) | O(1) |
341
- | `isEmpty()` | 비어 있는지 확인 | O(1) | O(1) |
342
- | `findAny()` | 아무 요소 찾기 | O(n) | O(1) |
344
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
345
+ |------|------|------------|------------|
346
+ | `anyMatch(predicate)` | 임의의 요소가 일치하는지 여부 | O(n) | O(1) |
347
+ | `allMatch(predicate)` | 모든 요소가 일치하는지 여부 | O(n) | O(1) |
348
+ | `count()` | 요소 | O(n) | O(1) |
349
+ | `isEmpty()` | 비어 있는지 여부 | O(1) | O(1) |
350
+ | `findAny()` | 임의의 요소 찾기 | O(n) | O(1) |
343
351
  | `findFirst()` | 첫 번째 요소 찾기 | O(n) | O(1) |
344
352
  | `findLast()` | 마지막 요소 찾기 | O(n) | O(1) |
345
353
  | `forEach(action)` | 모든 요소 반복 | O(n) | O(1) |
346
- | `group(classifier)` | 분류기로 그룹화 | O(n) | O(n) |
347
- | `groupBy(keyExtractor, valueExtractor)` | 키-값 추출기로 그룹화 | O(n) | O(n) |
354
+ | `group(classifier)` | 분류자로 그룹화 | O(n) | O(n) |
355
+ | `groupBy(keyExtractor, valueExtractor)` | 키-값 추출자로 그룹화 | O(n) | O(n) |
348
356
  | `join()` | 문자열로 결합 | O(n) | O(n) |
349
- | `join(delimiter)` | 구분자로 결합 | O(n) | O(n) |
350
- | `nonMatch(predicate)` | 일치하는 요소 없음 확인 | O(n) | O(1) |
351
- | `partition(count)` | 개수로 분할 | O(n) | O(n) |
352
- | `partitionBy(classifier)` | 분류기로 분할 | O(n) | O(n) |
357
+ | `join(delimiter)` | 구분자를 사용하여 결합 | O(n) | O(n) |
358
+ | `nonMatch(predicate)` | 일치하지 않는 요소가 있는지 여부 | O(n) | O(1) |
359
+ | `partition(count)` | 수로 분할 | O(n) | O(n) |
360
+ | `partitionBy(classifier)` | 분류자로 분할 | O(n) | O(n) |
353
361
  | `reduce(accumulator)` | 축소 작업 | O(n) | O(1) |
354
- | `reduce(identity, accumulator)` | 초기값을 사용한 축소 | O(n) | O(1) |
362
+ | `reduce(identity, accumulator)` | 초기값을 가진 축소 | O(n) | O(1) |
355
363
  | `toArray()` | 배열로 변환 | O(n) | O(n) |
356
- | `toMap(keyExtractor, valueExtractor)` | Map으로 변환 | O(n) | O(n) |
357
- | `toSet()` | Set으로 변환 | O(n) | O(n) |
364
+ | `toMap(keyExtractor, valueExtractor)` | 맵으로 변환 | O(n) | O(n) |
365
+ | `toSet()` | 세트로 변환 | O(n) | O(n) |
358
366
  | `write(stream)` | 스트림에 쓰기 | O(n) | O(1) |
359
367
 
360
368
  ```typescript
361
- // Collectable 작업 예제
369
+ // Collectable 작업
362
370
  const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
363
- .filter(n => n % 2 === 0)
371
+ .filter((n: number): boolean => n % 2 === 0)
364
372
  .toOrdered();
365
373
 
366
- // 일치 확인
367
- console.log(data.anyMatch(n => n > 5)); // true
368
- console.log(data.allMatch(n => n < 20)); // true
374
+ // 일치 여부 확인
375
+ console.log(data.anyMatch((n: number): boolean => n > 5)); // true
376
+ console.log(data.allMatch((n: number): boolean => n < 20)); // true
369
377
 
370
- // 검색 작업
371
- data.findFirst().ifPresent(n => console.log(n)); // 2
372
- data.findAny().ifPresent(n => console.log(n)); // 아무 요소
378
+ // 찾기 작업
379
+ data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
380
+ data.findAny().ifPresent((n: number): void => console.log(n)); // 임의의 요소
373
381
 
374
382
  // 그룹화 작업
375
383
  const grouped = data.groupBy(
376
- n => n > 5 ? "large" : "small",
377
- n => n * 2
378
- );
379
- // {small: [4, 8], large: [12, 16, 20]}
384
+ (n: number): string => (n > 5 ? "" : "작은"),
385
+ (n: number): number => n * 2
386
+ ); // {작은: [4, 8], 큰: [12, 16, 20]}
380
387
 
381
388
  // 축소 작업
382
389
  const sum = data.reduce(0, (acc, n) => acc + n); // 30
383
390
 
384
391
  // 출력 작업
385
- data.join(", "); // "2, 4, 6, 8, 10"
392
+ data.join(", "); // "[2, 4, 6, 8, 10]"
386
393
  ```
387
394
 
388
- ## 통계 분석 메서드
395
+ ## 통계 분석 메소드
389
396
 
390
- ### NumericStatistics 메서드
397
+ ### NumericStatistics 메소드
391
398
 
392
- | 메서드 | 설명 | 시간 복잡도 | 공간 복잡도 |
393
- |--------|------|------------|------------|
399
+ | 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
400
+ |------|------|------------|------------|
394
401
  | `range()` | 범위 | O(n) | O(1) |
395
402
  | `variance()` | 분산 | O(n) | O(1) |
396
- | `standardDeviation()` | 표준편차 | O(n) | O(1) |
403
+ | `standardDeviation()` | 표준 편차 | O(n) | O(1) |
397
404
  | `mean()` | 평균 | O(n) | O(1) |
398
405
  | `median()` | 중앙값 | O(n log n) | O(n) |
399
406
  | `mode()` | 최빈값 | O(n) | O(n) |
400
407
  | `frequency()` | 빈도 분포 | O(n) | O(n) |
401
408
  | `summate()` | 합계 | O(n) | O(1) |
402
- | `quantile(quantile)` | 분위수 | O(n log n) | O(n) |
403
- | `interquartileRange()` | 사분위 범위 | O(n log n) | O(n) |
409
+ | `quantile(quantile)` | 사분위수 | O(n log n) | O(n) |
410
+ | `interquartileRange()` | 사분위수 범위 | O(n log n) | O(n) |
404
411
  | `skewness()` | 왜도 | O(n) | O(1) |
405
412
  | `kurtosis()` | 첨도 | O(n) | O(1) |
406
413
 
407
414
  ```typescript
408
- // 통계 분석 예제
409
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
415
+ // 통계 분석
416
+ let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
410
417
  .toNumericStatistics();
411
418
 
412
419
  console.log("평균:", numbers.mean()); // 5.5
413
420
  console.log("중앙값:", numbers.median()); // 5.5
414
- console.log("표준편차:", numbers.standardDeviation()); // ~2.87
421
+ console.log("표준 편차:", numbers.standardDeviation()); // ~2.87
415
422
  console.log("합계:", numbers.summate()); // 55
416
423
 
417
424
  // 매퍼를 사용한 통계 분석
418
425
  const objects = from([
419
426
  { value: 10 },
420
- { value: 20 },
427
+ { value: 20 },
421
428
  { value: 30 }
422
429
  ]).toNumericStatistics();
423
-
424
430
  console.log("매핑된 평균:", objects.mean(obj => obj.value)); // 20
425
431
  ```
426
432
 
427
433
  ## 성능 선택 가이드
428
434
 
429
- ### 비정렬 수집기 선택 (성능 우선)
435
+ ### 순서 보장이 필요 없는 Collector 선택(성능 우선)
430
436
  ```typescript
431
- // 순서 보장이 필요하지 않은 경우
432
- const highPerformance = data
437
+ // 순서 보장이 필요 없는 경우, 최고의 성능을 위해 순서가 보장되지 않는 Collector 사용
438
+ let highPerformance = data
433
439
  .filter(predicate)
434
440
  .map(mapper)
435
- .toUnoredered(); // 최고 성능
441
+ .toUnoredered(); // 최고의 성능
436
442
  ```
437
443
 
438
- ### 정렬된 수집기 선택 (순서 필요)
444
+ ### 순서가 필요한 Collector 선택(순서 필요)
439
445
  ```typescript
440
- // 요소 순서를 유지해야 하는 경우
441
- const ordered = data.sorted(comparator);
446
+ // 요소의 순서를 유지해야 하는 경우, 순서가 보장되는 Collector 사용
447
+ let ordered = data.sorted(comparator);
442
448
  ```
443
449
 
444
- ### 윈도우 수집기 선택 (윈도우 작업)
450
+ ### 윈도우 작업이 필요한 Collector 선택(윈도우 작업)
445
451
  ```typescript
446
452
  // 윈도우 작업이 필요한 경우
447
- const windowed = data
453
+ let windowed: WindowCollectable<number> = data
448
454
  .toWindow()
449
455
  .slide(5n, 2n); // 슬라이딩 윈도우
450
456
  ```
451
457
 
452
- ### 통계 분석 선택 (숫자 계산)
458
+ ### 수치 계산이 필요한 통계 분석 선택(수치 계산)
453
459
  ```typescript
454
460
  // 통계 분석이 필요한 경우
455
- const stats = data
456
- .toNumericStatistics(); // 숫자 통계
461
+ let statistics: NumericStatistics<number> = data
462
+ .toNumericStatistics(); // 수치 통계
457
463
 
458
- const bigIntStats = data
459
- .toBigintStatistics(); // BigInt 통계
464
+ let bigIntStatistics: BigintStatistics<bigint> = data
465
+ .toBigintStatistics(); // 정수 통계
460
466
  ```
461
467
 
462
468
  [GitHub](https://github.com/eloyhere/semantic-typescript)
463
469
  [NPMJS](https://www.npmjs.com/package/semantic-typescript)
464
470
 
465
- ## 중요한 주의사항
471
+ ## 중요한 참고 사항
466
472
 
467
- 1. **정렬 작업의 영향**: 정렬된 수집기에서 `sorted()` 작업은 `redirect`, `translate`, `shuffle`, `reverse` 효과를 덮어씁니다
468
- 2. **성능 고려사항**: 순서 보장이 필요하지 않으면 `toUnoredered()`를 우선하여 나은 성능을 얻으세요
469
- 3. **메모리 사용량**: 정렬 작업에는 O(n)의 추가 공간이 필요합니다
470
- 4. **실시간 데이터**: Semantic 스트림은 실시간 데이터에 적합하며 비동기 데이터 소스를 지원합니다
473
+ 1. **정렬 작업의 영향**: 순서가 보장되는 컬렉터에서 `sorted()` 작업은 `redirect`, `translate`, `shuffle`, `reverse`의 효과를 무시합니다.
474
+ 2. **성능 고려 사항**: 순서 보장이 필요하지 않은 경우, `toUnordered()`를 사용하여 성능을 향상시키는 것이 좋습니다.
475
+ 3. **메모리 사용량**: 정렬 작업에는 추가적인 O(n)의 메모리가 필요합니다.
476
+ 4. **실시간 데이터**: 시맨틱 스트림은 실시간 데이터 처리에 적합하며 비동기 데이터 소스를 지원합니다.
471
477
 
472
- 이 라이브러리는 TypeScript 개발자에게 강력하고 유연한 스트림 처리 기능을 제공하며 함수형 프로그래밍의 이점과 타입 안전성을 결합합니다.
478
+ 이 라이브러리는 타입스크립트 개발자에게 강력하고 유연한 스트리밍 기능을 제공하며, 함수형 프로그래밍의 이점과 타입 안전성 보장을 결합합니다.