Skip to content

Commit dfd3b96

Browse files
committed
Merge branch 'fabiospampinato-voby-0.6.0'
2 parents 44b6b3a + 136e57e commit dfd3b96

File tree

3 files changed

+47
-62
lines changed

3 files changed

+47
-62
lines changed

frameworks/keyed/voby/package-lock.json

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frameworks/keyed/voby/package.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
{
22
"name": "js-framework-benchmark-voby",
3-
"version": "0.5.0",
3+
"version": "0.7.0",
44
"main": "dist/main.js",
55
"js-framework-benchmark": {
6-
"frameworkVersionFromPackage": "voby",
7-
"issues": [800]
6+
"frameworkVersionFromPackage": "voby"
87
},
98
"scripts": {
109
"build-prod": "rm -rf dist && mkdir dist && esbuild --bundle --minify --target=es2015 ./src/main.tsx > ./dist/main.js"
@@ -17,7 +16,7 @@
1716
"url": "https://github.com/krausest/js-framework-benchmark.git"
1817
},
1918
"dependencies": {
20-
"voby": "0.5.0"
19+
"voby": "0.7.0"
2120
},
2221
"devDependencies": {
2322
"esbuild": "0.14.23"

frameworks/keyed/voby/src/main.tsx

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

22
/* IMPORT */
33

4-
import {Observable, ObservableMaybe} from 'voby';
5-
import {$, createElement, render, template, For, Fragment} from 'voby';
4+
import {FunctionMaybe, Observable, ObservableMaybe} from 'voby';
5+
import {$, createElement, render, template, useSelector, 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,8 @@ 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;
137+
const isSelected = useSelector ( $selected );
153138

154139
return (
155140
<div class="container">
@@ -174,7 +159,8 @@ const App = (): JSX.Element => {
174159
<tbody>
175160
<For values={$data}>
176161
{( datum: IDatum ) => {
177-
const {id, label, className} = datum;
162+
const {id, label} = datum;
163+
const className = () => isSelected ( id ) ? 'danger' : '';
178164
const onSelect = select.bind ( undefined, id );
179165
const onRemove = remove.bind ( undefined, id );
180166
const props = {id, label, className, onSelect, onRemove};

0 commit comments

Comments
 (0)