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));
|
|||
|
|
}
|