Skip to content

Commit 099849c

Browse files
Updated benchmark implementation, keeping the state in one observable and cleaning up some code
1 parent c4c7b18 commit 099849c

File tree

1 file changed

+25
-40
lines changed

1 file changed

+25
-40
lines changed

frameworks/keyed/voby/src/main.tsx

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11

22
/* IMPORT */
33

4-
import {Observable, ObservableMaybe} from 'voby';
4+
import {FunctionMaybe, Observable, ObservableMaybe} from 'voby';
55
import {$, createElement, render, template, For, Fragment} from 'voby';
66

77
window.React = {createElement, Fragment};
88

99
/* TYPES */
1010

11-
type IDatum = { id: string, label: Observable<string>, selected: Observable<boolean>, className: Observable<string> };
11+
type IDatum = { id: number, label: Observable<string> };
1212

1313
type IData = IDatum[];
1414

@@ -18,28 +18,20 @@ const rand = ( max: number ): number => {
1818
return Math.round ( Math.random () * 1000 ) % max;
1919
};
2020

21-
const uuid = (() => {
22-
let counter = 1;
23-
return (): string => {
24-
return String ( counter++ );
25-
};
26-
})();
27-
2821
const buildData = (() => {
2922
const adjectives = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy'];
3023
const colors = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange'];
3124
const nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard'];
25+
let uuid = 1;
3226
return ( length: number ): IData => {
3327
const data: IData = new Array ( length );
3428
for ( let i = 0; i < length; i++ ) {
35-
const id = uuid ();
29+
const id = uuid++;
3630
const adjective = adjectives[rand ( adjectives.length )];
3731
const color = colors[rand ( colors.length )];
3832
const noun = nouns[rand ( nouns.length )];
3933
const label = $(`${adjective} ${color} ${noun}`);
40-
const selected = $(false);
41-
const className = $('');
42-
const datum: IDatum = { id, label, selected, className };
34+
const datum = { id, label };
4335
data[i] = datum;
4436
};
4537
return data;
@@ -52,8 +44,8 @@ const Model = (() => {
5244

5345
/* STATE */
5446

55-
let $data = $<IDatum[]>( [] );
56-
let selected: IDatum | null = null;
47+
const $data = $<IDatum[]>( [] );
48+
const $selected = $( -1 );
5749

5850
/* API */
5951

@@ -71,14 +63,16 @@ const Model = (() => {
7163
};
7264

7365
const add = (): void => {
74-
$data ( $data ().concat ( buildData ( 1000 ) ) );
66+
const data = $data ();
67+
data.push.apply ( data, buildData ( 1000 ) );
68+
$data.emit ();
7569
};
7670

7771
const update = (): void => {
7872
const data = $data ();
7973
for ( let i = 0, l = data.length; i < l; i += 10 ) {
8074
const {label} = data[i];
81-
label ( label () + ' !!!' );
75+
label.update ( label => label + ' !!!' );
8276
}
8377
};
8478

@@ -87,50 +81,40 @@ const Model = (() => {
8781
if ( data.length <= 998 ) return;
8882
const datum1 = data[1];
8983
const datum998 = data[998];
90-
const data2 = data.slice ();
91-
data2[1] = datum998;
92-
data2[998] = datum1;
93-
$data ( data2 );
84+
data[1] = datum998;
85+
data[998] = datum1;
86+
$data.emit ();
9487
};
9588

9689
const clear = (): void => {
9790
$data ( [] );
9891
};
9992

100-
const remove = ( id: string ): void => {
93+
const remove = ( id: number ): void => {
10194
const data = $data ();
10295
const index = data.findIndex ( datum => datum.id === id );
10396
if ( index === -1 ) return;
104-
$data ( data.slice ( 0, index ).concat ( data.slice ( index + 1 ) ) );
97+
data.splice ( index, 1 );
98+
$data.emit ();
10599
};
106100

107-
const select = ( id: string ): void => {
108-
if ( selected ) {
109-
selected.selected ( false );
110-
selected.className ( '' );
111-
selected = null;
112-
}
113-
const data = $data ();
114-
const datum = data.find ( datum => datum.id === id );
115-
if ( !datum ) return;
116-
datum.selected ( true );
117-
datum.className ( 'danger' );
118-
selected = datum;
101+
const select = ( id: number ): void => {
102+
$selected ( id );
119103
};
120104

121-
return { $data, selected, run, runLots, runWith, add, update, swapRows, clear, remove, select };
105+
return { $data, $selected, run, runLots, runWith, add, update, swapRows, clear, remove, select };
122106

123107
})();
124108

125109
/* MAIN */
126110

127-
const Button = ({ id, text, onClick }: { id: string, text: string, onClick: (( event: MouseEvent ) => any) }): JSX.Element => (
111+
const Button = ({ id, text, onClick }: { id: string | number, text: string, onClick: ObservableMaybe<(( event: MouseEvent ) => any)> }): JSX.Element => (
128112
<div class="col-sm-6 smallpad">
129113
<button id={id} class="btn btn-primary btn-block" type="button" onClick={onClick}>{text}</button>
130114
</div>
131115
);
132116

133-
const RowDynamic = ({ id, label, className, onSelect, onRemove }: { id: ObservableMaybe<string>, label: ObservableMaybe<string>, className: ObservableMaybe<string>, onSelect: ObservableMaybe<(( event: MouseEvent ) => any)>, onRemove: ObservableMaybe<(( event: MouseEvent ) => any)> }): JSX.Element => (
117+
const RowDynamic = ({ id, label, className, onSelect, onRemove }: { id: FunctionMaybe<string | number>, label: FunctionMaybe<string>, className: FunctionMaybe<string>, onSelect: ObservableMaybe<(( event: MouseEvent ) => any)>, onRemove: ObservableMaybe<(( event: MouseEvent ) => any)> }): JSX.Element => (
134118
<tr className={className}>
135119
<td class="col-md-1">{id}</td>
136120
<td class="col-md-4">
@@ -149,7 +133,7 @@ const RowTemplate = template ( RowDynamic, { recycle: true } );
149133

150134
const App = (): JSX.Element => {
151135

152-
const {$data, run, runLots, add, update, clear, swapRows, select, remove} = Model;
136+
const {$data, $selected, run, runLots, add, update, clear, swapRows, select, remove} = Model;
153137

154138
return (
155139
<div class="container">
@@ -174,7 +158,8 @@ const App = (): JSX.Element => {
174158
<tbody>
175159
<For values={$data}>
176160
{( datum: IDatum ) => {
177-
const {id, label, className} = datum;
161+
const {id, label} = datum;
162+
const className = () => ( $selected () === id ) ? 'danger' : '';
178163
const onSelect = select.bind ( undefined, id );
179164
const onRemove = remove.bind ( undefined, id );
180165
const props = {id, label, className, onSelect, onRemove};

0 commit comments

Comments
 (0)