Skip to content

Commit 13ee891

Browse files
committed
Implement the remainder of the benchmark
1 parent 47903fc commit 13ee891

File tree

4 files changed

+59
-21
lines changed

4 files changed

+59
-21
lines changed

frameworks/keyed/butterfloat/app-vm.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,20 @@ export class AppViewModel {
2626
return this.#rows
2727
}
2828

29+
readonly #rowsToUpdate: Observable<number>
30+
readonly #setRowsToUpdate: (rowsToUpdate: StateSetter<number>) => void
31+
get rowsToUpdate() {
32+
return this.#rowsToUpdate
33+
}
34+
2935
constructor() {
3036
;[this.#idRange, this.#setIdRange] = butterfly<IdRange>({
3137
min: 0,
3238
max: 0,
3339
added: [-1, -1],
3440
})
3541
;[this.#selectedId, this.#setSelectedId] = butterfly<number>(-1)
42+
;[this.#rowsToUpdate, this.#setRowsToUpdate] = butterfly<number>(-1)
3643

3744
this.#rows = this.#idRange.pipe(
3845
filter((idRange) => idRange.added[1] > 0),
@@ -68,4 +75,8 @@ export class AppViewModel {
6875
return { min, max, added: [current.max, count] }
6976
})
7077
}
78+
79+
updateRow(id: number) {
80+
this.#setRowsToUpdate(id)
81+
}
7182
}

frameworks/keyed/butterfloat/app.tsx

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ComponentContext, jsx, ObservableEvent } from 'butterfloat'
22
import { AppViewModel } from './app-vm.js'
33
import { Row } from './row.js'
4-
import { map } from 'rxjs'
4+
import { map, withLatestFrom } from 'rxjs'
55

66
interface AppEvents {
77
run: ObservableEvent<MouseEvent>
@@ -10,24 +10,46 @@ interface AppEvents {
1010
update: ObservableEvent<MouseEvent>
1111
clear: ObservableEvent<MouseEvent>
1212
swaprows: ObservableEvent<MouseEvent>
13+
tbodyAttach: ObservableEvent<HTMLElement>
1314
}
1415

1516
export function App(
1617
_props: unknown,
17-
{ bindImmediateEffect, events }: ComponentContext<AppEvents>,
18+
{ bindEffect, bindImmediateEffect, events }: ComponentContext<AppEvents>,
1819
) {
1920
const vm = new AppViewModel()
2021

2122
const children = vm.rows.pipe(map((row) => () => <Row vm={row} />))
2223

23-
bindImmediateEffect(events.run, () => {
24-
vm.createRows(1000)
25-
})
26-
bindImmediateEffect(events.runlots, () => {
27-
vm.createRows(10000)
28-
})
24+
bindImmediateEffect(events.run, () => vm.createRows(1000))
25+
bindImmediateEffect(events.runlots, () => vm.createRows(10000))
2926
bindImmediateEffect(events.add, () => vm.appendRows(1000))
3027
bindImmediateEffect(events.clear, () => vm.clear())
28+
bindEffect(
29+
events.update.pipe(withLatestFrom(events.tbodyAttach)),
30+
([_, tbody]) => {
31+
const rows = tbody.querySelectorAll('tr')
32+
for (let i = 0; i < rows.length; i += 10) {
33+
const row = rows[i]
34+
const id = Number.parseInt(row.dataset.id!, 10)
35+
vm.updateRow(id)
36+
}
37+
},
38+
)
39+
bindEffect(
40+
events.swaprows.pipe(withLatestFrom(events.tbodyAttach)),
41+
([_, tbody]) => {
42+
const rows = tbody.querySelectorAll('tr')
43+
if (rows.length > 998) {
44+
const row0 = rows[0]
45+
const row1 = rows[1]
46+
const row997 = rows[997]
47+
const row998 = rows[998]
48+
row0.after(row998)
49+
row997.after(row1)
50+
}
51+
},
52+
)
3153

3254
return (
3355
<div class="container">
@@ -107,6 +129,7 @@ export function App(
107129
id="tbody"
108130
childrenBind={children}
109131
childrenBindMode="append"
132+
events={{ bfDomAttach: events.tbodyAttach }}
110133
></tbody>
111134
</table>
112135
</div>

frameworks/keyed/butterfloat/row-vm.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
import { butterfly, StateSetter } from 'butterfloat'
2-
import {
3-
filter,
4-
map,
5-
merge,
6-
NEVER,
7-
Observable,
8-
Subject,
9-
takeUntil,
10-
tap,
11-
} from 'rxjs'
2+
import { filter, map, merge, Observable } from 'rxjs'
123
import { randomLabel } from './data.js'
134
import { AppViewModel } from './app-vm.js'
145

156
export class RowViewModel {
167
readonly #app: AppViewModel
8+
get app() {
9+
return this.#app
10+
}
1711

1812
readonly #id: number
1913
get id() {

frameworks/keyed/butterfloat/row.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,39 @@
11
import { ComponentContext, jsx, ObservableEvent } from 'butterfloat'
22
import { RowViewModel } from './row-vm'
3-
import { concat, NEVER, of, takeUntil } from 'rxjs'
3+
import { concat, filter, NEVER, of, takeUntil } from 'rxjs'
44

55
export interface RowProps {
66
vm: RowViewModel
77
}
88

99
export interface RowEvents {
10+
attach: ObservableEvent<HTMLElement>
1011
select: ObservableEvent<MouseEvent>
1112
remove: ObservableEvent<MouseEvent>
1213
}
1314

1415
export function Row(
1516
{ vm }: RowProps,
16-
{ bindImmediateEffect, events }: ComponentContext<RowEvents>,
17+
{ bindEffect, bindImmediateEffect, events }: ComponentContext<RowEvents>,
1718
) {
19+
bindImmediateEffect(events.attach, (element) => {
20+
element.dataset.id = vm.id.toString()
21+
})
1822
bindImmediateEffect(events.select, () => vm.select())
1923
bindImmediateEffect(events.remove.pipe(takeUntil(vm.removed)), () =>
2024
vm.remove(),
2125
)
26+
bindEffect(vm.app.rowsToUpdate.pipe(filter((id) => id === vm.id)), () =>
27+
vm.updateLabel(),
28+
)
2229

2330
const id = concat(of(vm.id.toString()), NEVER)
2431

2532
return (
26-
<tr classBind={{ danger: vm.selected }}>
33+
<tr
34+
classBind={{ danger: vm.selected }}
35+
events={{ bfDomAttach: events.attach }}
36+
>
2737
<td class="col-md-1" bind={{ innerText: id }}></td>
2838
<td class="col-md-4">
2939
<a bind={{ innerText: vm.label }} events={{ click: events.select }}></a>

0 commit comments

Comments
 (0)