Skip to content

Commit 2b37d67

Browse files
committed
Program inits/releases Subs in timeout, to allow previous dispatch to finish without side-effects on other Subs.
1 parent 0674730 commit 2b37d67

6 files changed

Lines changed: 35 additions & 58 deletions

File tree

core/src/TeaCup/Animation.ts

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,11 @@ import { Sub } from './Sub';
2727

2828
let subs: Array<RafSub<any>> = [];
2929

30-
let ticking = false;
31-
3230
function tick() {
33-
// console.log("tick()");
34-
if (!ticking) {
35-
ticking = true;
36-
const subsNow = [...subs];
37-
// console.log("tick() subsNow=" + subsNow);
38-
if (subsNow.length > 0) {
39-
requestAnimationFrame((t: number) => {
40-
// console.log("tick() trigger subsNow=" + subsNow);
41-
subsNow.forEach((s) => s.trigger(t));
42-
ticking = false;
43-
// console.log("tick() recursing");
44-
tick();
45-
});
46-
} else {
47-
ticking = false;
48-
}
31+
if (subs.length > 0) {
32+
requestAnimationFrame((t: number) => {
33+
subs.forEach((s) => s.trigger(t));
34+
});
4935
}
5036
}
5137

@@ -66,9 +52,6 @@ class RafSub<M> extends Sub<M> {
6652
protected onRelease() {
6753
super.onRelease();
6854
subs = subs.filter((s) => s !== this);
69-
if (subs.length === 0) {
70-
ticking = false;
71-
}
7255
}
7356

7457
trigger(t: number) {

samples/src/Samples/EventsSample.tsx

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,30 @@ const windowEvents = new WindowEvents<Msg>();
126126

127127
export function subscriptions(model: Model): Sub<Msg> {
128128
return Sub.batch([
129-
documentEvents.on('click', (e: MouseEvent) => (
130-
{
131-
type: 'clicked',
132-
position: {
133-
pos: [e.x, e.y],
134-
page: [e.pageX, e.pageY],
135-
offset: [e.offsetX, e.offsetY]
136-
}
137-
} as Msg
138-
)),
139-
documentEvents.on('mousemove', (e: MouseEvent) => ({
140-
type: 'moved',
141-
position: {
142-
pos: [e.x, e.y],
143-
page: [e.pageX, e.pageY],
144-
offset: [e.offsetX, e.offsetY]
145-
}
146-
} as Msg)),
147-
windowEvents.on('scroll', (e: Event) => {
148-
return {
149-
type: 'scrolled',
150-
scroll: [window.scrollX, window.scrollY]
151-
} as Msg;
152-
}),
129+
// documentEvents.on('click', (e: MouseEvent) => (
130+
// {
131+
// type: 'clicked',
132+
// position: {
133+
// pos: [e.x, e.y],
134+
// page: [e.pageX, e.pageY],
135+
// offset: [e.offsetX, e.offsetY]
136+
// }
137+
// } as Msg
138+
// )),
139+
// documentEvents.on('mousemove', (e: MouseEvent) => ({
140+
// type: 'moved',
141+
// position: {
142+
// pos: [e.x, e.y],
143+
// page: [e.pageX, e.pageY],
144+
// offset: [e.offsetX, e.offsetY]
145+
// }
146+
// } as Msg)),
147+
// windowEvents.on('scroll', (e: Event) => {
148+
// return {
149+
// type: 'scrolled',
150+
// scroll: [window.scrollX, window.scrollY]
151+
// } as Msg;
152+
// }),
153153
windowEvents.on('resize', () => {
154154
return {
155155
type: 'resized',

samples/src/Samples/Raf.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ export function update(msg: Msg, model: Model): [Model, Cmd<Msg>] {
104104
return noCmd({ ...model, started: !model.started });
105105
case 'raf':
106106
const delta = msg.t - model.t;
107-
const fps = 1000 / delta;
107+
const fps = delta === 0
108+
? model.fps
109+
: 1000 / delta;
108110
return noCmd({
109111
...model,
110112
t: msg.t,

samples/src/Samples/SelectSample.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ export function init(): [Model, Cmd<Msg>] {
4747

4848
export function view(dispatch: Dispatcher<Msg>, model: Model) {
4949
const value = model.selected.withDefault("select me");
50-
console.log("rendering value", value)
5150
return (
5251
<div className="select">
5352
<p><em>(Use me with Firefox, too.)</em></p>

tea-cup/src/TeaCup/DocumentEvents.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,6 @@ class DocSub<K extends keyof Map, Map, Msg> extends Sub<Msg> {
4242
this.listener = (e) => this.dispatch(this.mapper(e));
4343
}
4444

45-
protected dispatch(m: Msg) {
46-
const d = this.dispatcher;
47-
if (d !== undefined) {
48-
setTimeout(() => {
49-
d(m);
50-
});
51-
}
52-
}
53-
5445
protected onInit() {
5546
super.onInit();
5647
this.documentEvents.doAddListener(this.key, this.listener, this.options)

tea-cup/src/TeaCup/Program.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ export class Program<Model, Msg> extends Component<ProgramProps<Model, Msg>, nev
9191

9292
const d = this.dispatch.bind(this);
9393

94-
newSub.init(d);
95-
prevSub?.release();
94+
setTimeout(() => {
95+
newSub.init(d);
96+
prevSub?.release();
97+
});
9698

9799
// perform commands in a separate timout, to
98100
// make sure that this dispatch is done

0 commit comments

Comments
 (0)