Skip to content

Commit 5ff37a4

Browse files
committed
feat(marble): add support for handling multi-letter events
now you can create a stream like `--(ab)--|` which will only fire one event at 20ms and its value will be `ab`. Earlier this would have emitted multiple events for each charachter — `(,a,b,)` separated by 10ms.
1 parent f72352a commit 5ff37a4

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/internal/Marble.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ export function fromMarble(
1818
switch (message[i]) {
1919
case ' ':
2020
break
21+
case '(':
22+
let value = ''
23+
while (message[++i] !== ')') {
24+
value += message[i]
25+
}
26+
events.push(EVENT.next(time, value))
27+
time += size
28+
break
2129
case '-':
2230
time += size
2331
break
@@ -55,7 +63,8 @@ export function toMarble<T>(
5563
while (count-- > 1) message += '-'
5664
switch (ev.type) {
5765
case EventType.next:
58-
message += (ev as EventNext<T>).value.toString()
66+
const s = (ev as EventNext<T>).value.toString()
67+
message += s.length > 1 ? `(${s})` : s
5968
break
6069
case EventType.error:
6170
message += '#'

test/test.Marble.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,39 @@ describe('marble()', () => {
3232

3333
it('should ignore whitespaces', () => {
3434
const message = ' -A B -- C | '
35-
3635
const actual = toMarble(fromMarble(message))
3736
const expected = '-AB--C|'
3837
assert.strictEqual(actual, expected)
3938
})
4039

40+
it('should parse multi-letter messages', () => {
41+
const message = ' -(ABC)-(PQR)-|'
42+
const actual = fromMarble(message)
43+
const expected = [
44+
EVENT.next(210, 'ABC'),
45+
EVENT.next(230, 'PQR'),
46+
EVENT.complete(250)
47+
]
48+
assert.deepEqual(actual, expected)
49+
})
50+
51+
it('should create multi-letter messages', () => {
52+
const actual = toMarble([
53+
EVENT.next(210, 'ABC'),
54+
EVENT.next(230, 'PQR'),
55+
EVENT.complete(250)
56+
])
57+
const expected = '-(ABC)-(PQR)-|'
58+
assert.deepEqual(actual, expected)
59+
})
60+
61+
it('should interop with multi-letter messages', () => {
62+
const test = '--a--(bc)--p(qr)--|'
63+
const actual = toMarble(fromMarble(test))
64+
const expected = test
65+
assert.strictEqual(actual, expected)
66+
})
67+
4168
it('should auto convert values to numbers if possible', () => {
4269
const message = '--1-2-3-4'
4370
const actual = fromMarble(message)

0 commit comments

Comments
 (0)