33 lines
856 B
JavaScript
33 lines
856 B
JavaScript
import {get, set, init} from "./schedule.js";
|
||
|
||
function start(name) {
|
||
return (name + "").trim().split(/^|\s+/).every(function(t) {
|
||
var i = t.indexOf(".");
|
||
if (i >= 0) t = t.slice(0, i);
|
||
return !t || t === "start";
|
||
});
|
||
}
|
||
|
||
function onFunction(id, name, listener) {
|
||
var on0, on1, sit = start(name) ? init : set;
|
||
return function() {
|
||
var schedule = sit(this, id),
|
||
on = schedule.on;
|
||
|
||
// If this node shared a dispatch with the previous node,
|
||
// just assign the updated shared dispatch and we’re done!
|
||
// Otherwise, copy-on-write.
|
||
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
|
||
|
||
schedule.on = on1;
|
||
};
|
||
}
|
||
|
||
export default function(name, listener) {
|
||
var id = this._id;
|
||
|
||
return arguments.length < 2
|
||
? get(this.node(), id).on.on(name)
|
||
: this.each(onFunction(id, name, listener));
|
||
}
|