@bokeh/bokehjs
Version:
Interactive, novel data visualization
63 lines • 2.04 kB
JavaScript
import { difference } from "./util/array";
import { assert } from "./util/assert";
async function _build_view(view_cls, model, options) {
assert(view_cls != null, "model doesn't implement a view");
const view = new view_cls({ ...options, model });
view.initialize();
await view.lazy_initialize();
return view;
}
export async function build_view(model, options = { parent: null }, cls = (model) => model.default_view) {
const view = await _build_view(cls(model), model, options);
view.connect_signals();
return view;
}
export async function build_views(view_storage, models, options = { parent: null }, cls = (model) => model.default_view) {
const to_remove = difference([...view_storage.keys()], models);
const removed_views = [];
for (const model of to_remove) {
const view = view_storage.get(model);
if (view != null) {
view_storage.delete(model);
removed_views.push(view);
view.remove();
}
}
const created_views = [];
const new_models = models.filter((model) => !view_storage.has(model));
for (const model of new_models) {
const view = await _build_view(cls(model), model, options);
view_storage.set(model, view);
created_views.push(view);
}
for (const view of created_views) {
view.connect_signals();
}
return {
created: created_views,
removed: removed_views,
};
}
export function remove_views(view_storage) {
for (const [model, view] of view_storage) {
view.remove();
view_storage.delete(model);
}
}
export function traverse_views(views, fn) {
const visited = new Set();
const queue = [...views];
while (true) {
const view = queue.shift();
if (view === undefined) {
break;
}
if (visited.has(view)) {
continue;
}
visited.add(view);
queue.push(...view.children());
fn(view);
}
}
//# sourceMappingURL=build_views.js.map