semantic-typescript 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.md CHANGED
@@ -1,32 +1,34 @@
1
- # **Semantic-TypeScript**
1
+ # **SemanticTypeScript**
2
2
  **Flow, Indexed.** Your data, under precise control.
3
3
 
4
4
  ---
5
5
 
6
6
  ### Overview
7
7
 
8
- Semantic-TypeScript marks a significant leap forward in stream processing technology, **synthesising** the most effective concepts from JavaScript `GeneratorFunction`, Java Streams, and MySQL-style indexing. Its core philosophy is both simple and powerful: construct exceptionally efficient data-processing pipelines through intelligent indexing, not through brute-force iteration.
8
+ SemanticTypeScript represents a significant evolution in stream processing, elegantly **synthesising** the most effective paradigms from JavaScript generators, Java Streams, and MySQL-style indexing. Its foundational premise is both powerful and deliberate: to construct exceptionally efficient dataprocessing pipelines through intelligent indexing, rather than through conventional bruteforce iteration.
9
9
 
10
- Where conventional libraries impose synchronous loops or unwieldy promise chains, Semantic-TypeScript delivers a **fully asynchronous**, functionally pure, and rigorously type-safe experience, designed for the demands of modern front-end development.
10
+ Where typical libraries enforce synchronous loops or unwieldy promise chains, SemanticTypeScript provides a **fully asynchronous**, functionally pure, and rigorously typesafe experience, designed expressly for the demands of modern application development.
11
11
 
12
- In its elegant model, data only reaches the consumer when the upstream pipeline explicitly invokes the `accept` (and optionally `interrupt`) callbacks. You have complete control over the timing—exactly when it is needed.
12
+ This model embodies a refined form of control flow: data only proceeds to the consumer when the upstream pipeline explicitly invokes the `accept` callback. You retain complete, granular command over timing—processing occurs precisely when, and only when, it is required.
13
13
 
14
14
  ---
15
15
 
16
- ### Why Developers Prefer It
16
+ ### Why Developers Choose Semantic‑TypeScript
17
17
 
18
- - **Zero-Boilerplate Indexing** every element carries its natural or bespoke index.
19
- - **Pure Functional Style** with full TypeScript inference.
20
- - **Leak-Proof Event Streams** `useWindow`, `useDocument`, `useHTMLElement`, and `useWebSocket` are built with safety in mind. You define the boundary—using `limit(n)`, `sub(start, end)`, or `takeWhile(predicate)`—and the library manages the cleanup. No lingering listeners, no memory leaks.
21
- - **Built-in Statistics** comprehensive numeric and bigint analytics including averages, medians, modes, variance, skewness, and kurtosis.
22
- - **Predictable Performance** choose between ordered or unordered collectors based on your requirements.
23
- - **Memory-Efficient** streams are evaluated lazily, alleviating memory concerns.
24
- - **No Undefined Behaviour** TypeScript guarantees type safety and nullability. Input data remains unmodified unless explicitly altered within your callback functions.
18
+ - **ZeroBoilerplate Indexing** Every element inherently possesses its natural or bespoke index, eliminating manual tracking.
19
+ - **Purely Functional & Type‑Safe** Enjoy full, idiomatic TypeScript inference alongside immutable operations.
20
+ - **LeakProof Event Streams** The `useSubscription` pattern is designed with resource safety as a first principle. You define the logical boundary—using `limit(n)`, `sub(start, end)`, or `takeWhile(predicate)`—and the library manages the complete subscription lifecycle. This ensures no lingering listeners and no memory leaks.
21
+ - **Builtin Statistical Suite** Access comprehensive analytics for both `number` and `bigint` streams, including averages, medians, modes, variance, skewness, and kurtosis without external dependencies.
22
+ - **Predictable, Tunable Performance** Select between ordered or unordered collectors to match your exact performance and ordering requirements.
23
+ - **Inherently MemoryEfficient** Streams are evaluated lazily, processing elements on‑demand to alleviate memory pressure.
24
+ - **No Undefined Behaviour** TypeScript guarantees complete type safety and nullability. Your source data remains immutable unless explicitly altered within your callback functions.
25
25
 
26
26
  ---
27
27
 
28
28
  ### Installation
29
29
 
30
+ Integrate Semantic‑TypeScript into your project using your preferred package manager:
31
+
30
32
  ```bash
31
33
  npm install semantic-typescript
32
34
  ```
@@ -37,177 +39,232 @@ yarn add semantic-typescript
37
39
 
38
40
  ---
39
41
 
40
- ### Quick Start
42
+ ### A Practical Introduction
43
+
44
+ The following examples demonstrate core concepts, from foundational transformations to real‑world event handling.
41
45
 
42
46
  ```typescript
43
- import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
44
-
45
- // Numeric statistics
46
- let summate: number = useOf(10, 20, 30, 40)
47
- .map((n: number): number => n * 2)
48
- .toNumericStatistics() // Required before terminal operation
49
- .summate(); // 200
50
-
51
- // Bigint statistics
52
- let summate: bigint = useOf(10n, 20n, 30n, 40n)
53
- .map((n: bigint): bigint => n * 2)
54
- .toBigIntStatistics() // Required before terminal operation
55
- .summate(); // 200n
56
-
57
- // Reverse a stream by index
58
- useFrom([1, 2, 3, 4, 5])
59
- .redirect((element: E, index: bigint): bigint => -index) // Negative index for reversal
60
- .toOrdered() // Call toOrdered() to preserve index order
61
- .toArray(); // [5, 4, 3, 2, 1]
62
-
63
- // Shuffle a stream
64
- useFrom([1, 2, 3, 4, 5])
65
- .shuffle()
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // EXAMPLE 1: Foundational Operations & Numeric Statistics
51
+ // ====================================================================
52
+ // Demonstrates mapping and terminal statistical operations. After transformation,
53
+ // the pipeline must be converted to a statistics collector before calling
54
+ // terminal methods like `.summate()`.
55
+
56
+ const numericSum: number = useOf(10, 20, 30, 40)
57
+ .map((n: number): number => n * 2) // Double each element: [20, 40, 60, 80]
58
+ .toNumericStatistics() // Convert to a statistics collector
59
+ .summate(); // Terminal operation: 200
60
+
61
+ // Additional statistical methods (available after .toNumericStatistics()):
62
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
63
+
64
+ // ====================================================================
65
+ // EXAMPLE 2: BigInt Statistics
66
+ // ====================================================================
67
+ // Operates identically to numeric statistics but is optimised for BigInt data.
68
+
69
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
70
+ .map((n: bigint): bigint => n * 2n) // BigInt arithmetic
71
+ .toBigIntStatistics() // Convert to BigInt statistics collector
72
+ .summate(); // Terminal operation: 200n
73
+
74
+ // ====================================================================
75
+ // EXAMPLE 3: Index Manipulation for Stream Reversal
76
+ // ====================================================================
77
+ // Illustrates reordering elements by strategically reassigning their indices
78
+ // using the `.redirect()` method, enabling custom patterns like reversal.
79
+
80
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
81
+ .redirect((_element: number, index: bigint): bigint => -index) // Map to negative indices
82
+ .toOrdered() // Essential: collects elements sorted by their new indices
83
+ .toArray(); // Result: [5, 4, 3, 2, 1]
84
+
85
+ // For simple reversal, `.reverse()` is also available.
86
+
87
+ // ====================================================================
88
+ // EXAMPLE 4: Stream Shuffling
89
+ // ====================================================================
90
+ // Randomly permutes element indices using an in-place shuffle algorithm.
91
+
92
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
93
+ .shuffle() // Randomly reassigns indices
94
+ .toOrdered() // Orders by the new random indices
95
+ .toArray(); // e.g., [2, 5, 1, 4, 3] (varies per execution)
96
+
97
+ // ====================================================================
98
+ // EXAMPLE 5: Circular Stream Rotation
99
+ // ====================================================================
100
+ // Shifts elements cyclically. Positive values rotate right; negative values rotate left.
101
+
102
+ // Right rotation by 2 positions
103
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
104
+ .translate(2) // Shift indices right by 2
66
105
  .toOrdered()
67
- .toArray(); // e.g., [2, 5, 1, 4, 3]
106
+ .toArray(); // Result: [4, 5, 1, 2, 3]
68
107
 
69
- // Translate elements within a stream
70
- useFrom([1, 2, 3, 4, 5])
71
- .translate(2) // Shift elements right by 2 positions
72
- .toOrdered()
73
- .toArray(); // [4, 5, 1, 2, 3]
108
+ // ====================================================================
109
+ // EXAMPLE 6: Lazy Evaluation with Infinite Ranges
110
+ // ====================================================================
111
+ // Processes theoretically infinite streams lazily, computing elements only as needed.
74
112
 
75
- useFrom([1, 2, 3, 4, 5])
76
- .translate(-2) // Shift elements left by 2 positions
77
- .toOrdered()
78
- .toArray(); // [3, 4, 5, 1, 2]
113
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
114
+ .filter(n => n % 17n === 0n) // Keep multiples of 17
115
+ .limit(10n) // Critical: stops after the 10th match
116
+ .toUnordered() // No sorting required
117
+ .toArray(); // Result: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
79
118
 
80
- // Infinite range with early termination
81
- useRange(0n, 1_000_000n)
82
- .filter(n => n % 17n === 0n)
83
- .limit(10n) // Stop after 10 elements
84
- .toUnordered()
119
+ // Without `.limit(10n)`, the pipeline would process all one million elements.
120
+
121
+ // ====================================================================
122
+ // EXAMPLE 7: Composing a Complex Pipeline
123
+ // ====================================================================
124
+ // Demonstrates sequential composition of multiple operations.
125
+
126
+ const complexResult: number[] = useRange(1n, 100n)
127
+ .map(n => Number(n) * 2)
128
+ .filter(n => n > 50)
129
+ .shuffle()
130
+ .limit(5n)
131
+ .translate(2)
132
+ .toOrdered()
85
133
  .toArray();
86
134
 
87
- // Real-time window resize (stops automatically after 5 events)
88
- useWindow("resize")
89
- .limit(5n) // Crucial for event streams
90
- .toUnordered()
91
- .forEach((ev, idx) => console.log(`Resize #${idx}`));
135
+ // ====================================================================
136
+ // EXAMPLE 8: Managed DOM Event Subscription
137
+ // ====================================================================
138
+ // Listens to browser events with automatic, leak-proof cleanup.
139
+ // The `.limit(n)` call defines the boundary for automatic listener removal.
140
+
141
+ // Define a subscriber for a Window target
142
+ const windowSubscriber = {
143
+ mount: (target: Window): void => { /* Setup logic */ },
144
+ subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
145
+ target.addEventListener(event, handler);
146
+ },
147
+ unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
148
+ target.removeEventListener(event, handler);
149
+ },
150
+ unmount: (): void => { /* Cleanup logic */ }
151
+ };
92
152
 
93
- // Listen to an HTML element
94
- // <input id="input" type="text"/>
95
- useHTMLElement("#input", "change")
96
- .limit(1)
153
+ useSubscription(window, windowSubscriber, "resize")
154
+ .limit(5n) // Automatically unsubscribes after 5 events
97
155
  .toUnordered()
98
- .forEach((event: Event) => submit(event));
156
+ .forEach((ev: Event, idx) =>
157
+ console.log(`Resize #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
158
+ );
99
159
 
100
- // Listen to multiple elements and events
101
- useHTMLElement("input", ["change", "keyup"])
102
- .takeWhile((event: Event): boolean => validate(event))
103
- .toUnordered()
104
- .forEach((event: Event) => submit(event));
105
-
106
- // Listen to a WebSocket
107
- let webSocket = new WebSocket("ws://localhost:8080");
108
- webSocket.addEventListener("close", (): void => {
109
- webSocket.close(); // Manage the WebSocket lifecycle manually
110
- });
111
- useWebSocket(webSocket, "message")
112
- .limit(1)
113
- .toUnordered()
114
- .forEach((message: MessageEvent) => console.log(message.data));
160
+ // ====================================================================
161
+ // EXAMPLE 9: String Processing by Unicode Code Points
162
+ // ====================================================================
163
+ // Iterates over a string correctly, handling multi-byte Unicode characters.
115
164
 
116
- // Iterate over a string by code point
117
165
  useText("My emotion now is: 😊, and semantic is 👍")
118
166
  .toUnordered()
119
- .log(); // Outputs the string
167
+ .log(); // Logs each character, including emoji, on a new line.
120
168
 
121
- // Safely stringify an object with circular references
122
- let o = {
169
+ // ====================================================================
170
+ // EXAMPLE 10: Safe Circular Reference Stringification
171
+ // ====================================================================
172
+ // Safely serialises objects containing circular references.
173
+
174
+ const obj = {
123
175
  a: 1,
124
- b: "text",
125
- c: [o.a, o.b, o.c] // Circular reference
176
+ b: "text"
126
177
  };
127
- // let text: string = JSON.stringify(o); // Throws an error
128
- let text: string = useStringify(o); // Safely yields `{a: 1, b: "text", c: []}`
178
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // Introduce circularity
179
+
180
+ // const text: string = JSON.stringify(obj); // Throws an error
181
+ const text: string = useStringify(obj); // Safely yields `{a: 1, b: "text", c: []}`
129
182
  ```
130
183
 
131
184
  ---
132
185
 
133
186
  ### Core Concepts
134
187
 
135
- | Concept | Purpose | When to Use |
188
+ | Concept | Purpose | Primary Use Case |
136
189
  | :--- | :--- | :--- |
137
- | `AsynchronousSemantic` | Core builder for asynchronous streams, events, and lazy pipelines. | Real-time events, WebSockets, DOM listeners, long-running or infinite streams. |
138
- | `SynchronousSemantic` | Builder for synchronous, in-memory, or loop-based streams. | Static data, ranges, immediate iteration. |
139
- | `toUnordered()` | Fastest terminal collector (Map-based indexing). | Performance-critical paths (O(n) time & space, no sorting). |
140
- | `toOrdered()` | Sorted, index-stable collector. | When stable ordering or indexed access is required. |
141
- | `toNumericStatistics()` | Rich numeric statistical analysis (mean, median, variance, skewness, kurtosis, etc.). | Data analytics and statistical computations. |
142
- | `toBigIntStatistics()` | Rich bigint statistical analysis. | Data analytics and statistical computations for large integers. |
143
- | `toWindow()` | Sliding and tumbling window support. | Time-series processing, batching, and windowed operations. |
190
+ | `AsynchronousSemantic` | The core builder for asynchronous streams, events, and lazy, push‑based pipelines. | Realtime events, WebSockets, DOM listeners, or any longrunning/infinite stream. |
191
+ | `SynchronousSemantic` | The builder for synchronous, inmemory, or eager, pull‑based streams. | Static data, finite ranges, or immediate iteration tasks. |
192
+ | `toUnordered()` | The fastest terminal collector, using a Map for index storage. | Performancecritical paths where stable order is not required (O(n) time & space). |
193
+ | `toOrdered()` | A sorted, indexstable terminal collector. | When element order must be preserved or indexed access is needed. |
194
+ | `toNumericStatistics()` | A collector enabling rich statistical analysis on `number` streams. | Data analytics, metrics, and statistical computations. |
195
+ | `toBigIntStatistics()` | A collector enabling rich statistical analysis on `bigint` streams. | Analytics and statistics for large integer datasets. |
196
+ | `toWindow()` | Provides sliding and tumbling window operations over a stream. | Timeseries analysis, batch processing, and windowed aggregations. |
144
197
 
145
198
  ---
146
199
 
147
- **Important Usage Rules**
200
+ **Essential Usage Rules**
148
201
 
149
- 1. **Event streams** (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) return an `AsynchronousSemantic`.
150
- → You **must** call `.limit(n)`, `.sub(start, end)`, or `.takeWhile()` to cease listening. Otherwise, the listener remains active.
202
+ 1. **Event streams** (created via factories like `useSubscription`) return an `AsynchronousSemantic`.
203
+ → You **must** call a boundary‑defining method like `.limit(n)`, `.sub(start, end)`, or `.takeWhile(predicate)` to terminate the listener. Failure to do so will leave the subscription active.
151
204
 
152
- 2. **Terminal operations** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) are **only available after** conversion to a collector:
205
+ 2. **Terminal operations** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()`, etc.) are **only available after** converting the pipeline to a collector:
153
206
  ```typescript
154
- .toUnordered() // O(n) time & space, no sorting
207
+ .toUnordered() // For maximum speed, order not guaranteed.
155
208
  // or
156
- .toOrdered() // Sorted, maintains order
209
+ .toOrdered() // For stable, sorted output.
210
+ // or
211
+ .toNumericStatistics() // For statistical methods.
157
212
  ```
158
213
 
159
214
  ---
160
215
 
161
216
  ### Performance Characteristics
162
217
 
163
- | Collector | Time Complexity | Space Complexity | Sorted? | Best For |
218
+ | Collector | Time Complexity | Space Complexity | Order Guarantee? | Ideal Scenario |
164
219
  | :--- | :--- | :--- | :--- | :--- |
165
- | `toUnordered()` | O(n) | O(n) | No | Raw speed, order not required. |
166
- | `toOrdered()` | O(2n) | O(n) | Yes | Stable ordering, indexed access, analytics. |
167
- | `toNumericStatistics()` | O(2n) | O(n) | Yes | Statistical operations requiring sorted data. |
168
- | `toBigIntStatistics()` | O(2n) | O(n) | Yes | Statistical operations for bigint. |
169
- | `toWindow()` | O(2n) | O(n) | Yes | Time-based windowing operations. |
220
+ | `toUnordered()` | O(n) | O(n) | No | Raw throughput is key; final order is irrelevant. |
221
+ | `toOrdered()` | O(n log n) | O(n) | Yes (sorted) | Stable ordering, indexed access, or pre‑sorting for statistics. |
222
+ | `toNumericStatistics()` | O(n log n) | O(n) | Yes (internal sort) | Performing statistical operations which require sorted data. |
223
+ | `toBigIntStatistics()` | O(n log n) | O(n) | Yes (internal sort) | Statistical operations on BigInt data. |
224
+ | `toWindow()` | O(n log n) | O(n) | Yes (internal sort) | Windowing operations which benefit from sorted indices. |
170
225
 
171
- Opt for `toUnordered()` when speed is paramount. Use `toOrdered()` only when you require stable ordering or statistical methods that depend on sorted data.
226
+ Select `toUnordered()` when absolute speed is paramount. Opt for `toOrdered()` or a statistics collector only when your logic depends on element order.
172
227
 
173
228
  ---
174
229
 
175
- **Comparison with Other Front-End Stream Processors**
230
+ **Comparative Analysis with Contemporary Stream Libraries**
176
231
 
177
- | Feature | Semantic-TypeScript | RxJS | Native Async Iterators / Generators | Most.js |
232
+ | Feature | SemanticTypeScript | RxJS | Native Async Iterators / Generators | Most.js |
178
233
  | :--- | :--- | :--- | :--- | :--- |
179
- | **TypeScript Integration** | First-class, deeply typed with native index awareness. | Excellent, but involves complex generics. | Good, requires manual typing. | Strong, functional-first style. |
180
- | **Built-in Statistical Analysis** | Comprehensive native support for `number` and `bigint`. | Not available natively (requires custom operators). | None. | None. |
181
- | **Indexing & Position Awareness** | Native, powerful bigint indexing on every element. | Requires custom operators (`scan`, `withLatestFrom`). | Manual counter required. | Basic, no built-in index. |
182
- | **Event Stream Management** | Dedicated, type-safe factories with explicit early-stop control. | Powerful but requires manual subscription management. | Manual event listener + cancellation. | Good `fromEvent`, lightweight. |
183
- | **Performance & Memory Efficiency** | Exceptional – optimised `toUnordered()` and `toOrdered()` collectors. | Very good, but operator chains add overhead. | Excellent (zero overhead). | Excellent. |
184
- | **Bundle Size** | Very lightweight. | Large (even with tree-shaking). | Zero (native). | Small. |
185
- | **API Design Philosophy** | Functional collector pattern with explicit indexing. | Reactive Observable pattern. | Iterator / Generator pattern. | Functional, point-free. |
186
- | **Early Termination & Control** | Explicit (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Good (`take`, `takeUntil`, `first`). | Manual (`break` in `for await…of`). | Good (`take`, `until`). |
187
- | **Synchronous & Asynchronous Support** | Unified API – first-class support for both. | Primarily asynchronous. | Both, but manual. | Primarily asynchronous. |
188
- | **Learning Curve** | Gentle for developers familiar with functional and indexed pipelines. | Steeper (many operators, hot/cold observables). | Low. | Moderate. |
234
+ | **TypeScript Integration** | Firstclass, deeply typed with inherent index awareness. | Excellent, though often involving complex generic chains. | Good, but requires manual type annotations. | Strong, with a functionalfirst typing style. |
235
+ | **Builtin Statistical Analysis** | Comprehensive native support for `number` and `bigint`. | Not available natively (requires custom operators or other libraries). | None. | None. |
236
+ | **Indexing & Position Awareness** | Native, powerful BigInt indexing on every element. | Requires custom operators (e.g., `scan`, `withLatestFrom`). | Manual counter management is necessary. | Basic, no builtin index property. |
237
+ | **Event Stream Management** | Dedicated, typesafe factories with explicit, declarative lifecycle control. | Powerful but requires careful manual subscription management to prevent leaks. | Manual event listener attachment and cancellation token management. | Good `fromEvent`, generally lightweight. |
238
+ | **Performance & Memory** | Exceptional – offers optimised `toUnordered()` and `toOrdered()` collectors. | Very good, though deep operator chains can introduce overhead. | Excellent (minimal native overhead). | Excellent. |
239
+ | **Bundle Size** | Very lightweight. | Substantial (even with treeshaking). | Zero (native language feature). | Small. |
240
+ | **API Design Philosophy** | Functional collector pattern with explicit indexing semantics. | Reactive Observable pattern. | Imperative Iterator / declarative Generator pattern. | Functional, pointfree composition. |
241
+ | **Flow Control** | Explicit (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Good (`take`, `takeUntil`, `first`). | Manual (`break` in loops). | Good (`take`, `until`). |
242
+ | **Sync & Async Support** | Unified API – firstclass support for both paradigms. | Primarily asynchronous. | Both supported, but with manual bridging. | Primarily asynchronous. |
243
+ | **Learning Curve** | Gentle for developers familiar with functional and indexed collection pipelines. | Steeper (extensive operator lexicon, hot/cold observable concepts). | Low to moderate. | Moderate. |
189
244
 
190
- **Key Advantages of Semantic-TypeScript**
245
+ **The SemanticTypeScript Advantage**
191
246
 
192
- * Unique built-in statistical and indexing capabilities, eliminating the need for manual `reduce` or external libraries.
193
- * Explicit control over event streams prevents the memory leaks common in RxJS.
194
- * A unified synchronous/asynchronous design provides a single, consistent API for diverse use cases.
247
+ * **Unique Capabilities:** Integrated statistical and indexing features eliminate the need for manual `reduce` operations or supplementary data‑analysis libraries.
248
+ * **Predictable Resource Management:** Explicit control over event streams prevents the memory leaks that can be subtle in RxJS applications.
249
+ * **Unified Design:** A consistent API for both synchronous and asynchronous workflows reduces cognitive load and code duplication.
195
250
 
196
- This comparison illustrates why Semantic-TypeScript is particularly well-suited for modern TypeScript front-end applications that demand performance, type safety, and rich analytics without the ceremony of traditional reactive libraries.
251
+ This comparison highlights why SemanticTypeScript is particularly wellsuited for modern TypeScript applications that demand high performance, robust type safety, and rich data‑processing features without the complexity of traditional reactive frameworks.
197
252
 
198
253
  ---
199
254
 
200
- ### Ready to Explore?
255
+ ### Begin Your Exploration
256
+
257
+ Semantic‑TypeScript transforms intricate data flows into readable, composable, and high‑performance pipelines. Whether you are handling real‑time UI events, processing substantial datasets, or constructing analytical dashboards, it delivers the power of database‑grade indexing with the elegance of functional programming.
201
258
 
202
- Semantic-TypeScript transforms complex data flows into readable, composable, and high-performance pipelines. Whether you are handling real-time UI events, processing large datasets, or building analytics dashboards, it provides the power of database-grade indexing with the elegance of functional programming.
259
+ **Your Next Steps:**
203
260
 
204
- **Next Steps:**
261
+ * Explore the fully typed API directly within your IDE (all exports are available from the main package entry point).
262
+ * Join the growing community of developers who have replaced convoluted async iterators and complex reactive chains with clear, intentional Semantic pipelines.
205
263
 
206
- * Browse the fully typed API in your IDE (all exports are from the main package).
207
- * Join the growing community of developers who have replaced convoluted async iterators with clean Semantic pipelines.
264
+ **Semantic‑TypeScript** where streams meet structure.
208
265
 
209
- **Semantic-TypeScript** where streams meet structure.
266
+ Begin building today and experience the tangible difference that thoughtful indexing delivers.
210
267
 
211
- Begin building today and experience the difference that thoughtful indexing delivers.
268
+ **Build with clarity, proceed with confidence, and transform data with intent.**
212
269
 
213
- **Build with clarity, proceed with confidence, and transform data with intent.**
270
+ MIT © Eloy Kim