@perspective-dev/viewer 5.5.1 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -3
- package/dist/cdn/perspective-viewer.js +9 -9
- package/dist/cdn/perspective-viewer.js.map +3 -3
- package/dist/css/blueprint.css +1 -1
- package/dist/css/botanical.css +1 -1
- package/dist/css/dracula.css +1 -1
- package/dist/css/eggplant.css +1 -1
- package/dist/css/gruvbox-dark.css +1 -1
- package/dist/css/gruvbox.css +1 -1
- package/dist/css/icons.css +1 -1
- package/dist/css/intl/ar.css +1 -1
- package/dist/css/intl/de.css +1 -1
- package/dist/css/intl/es.css +1 -1
- package/dist/css/intl/fr.css +1 -1
- package/dist/css/intl/ja.css +1 -1
- package/dist/css/intl/pt.css +1 -1
- package/dist/css/intl/zh.css +1 -1
- package/dist/css/intl.css +1 -1
- package/dist/css/ledger.css +1 -1
- package/dist/css/monokai.css +1 -1
- package/dist/css/nord.css +1 -1
- package/dist/css/phosphor.css +1 -1
- package/dist/css/pro-dark.css +1 -1
- package/dist/css/pro.css +1 -1
- package/dist/css/solarized-dark.css +1 -1
- package/dist/css/solarized.css +1 -1
- package/dist/css/themes.css +1 -1
- package/dist/css/vaporwave.css +1 -1
- package/dist/css/velvet.css +1 -1
- package/dist/docs/perspective-docs.json +1 -1
- package/dist/esm/column-format.js +2 -0
- package/dist/esm/column-format.js.map +7 -0
- package/dist/esm/extensions.d.ts +3 -13
- package/dist/esm/perspective-viewer.d.ts +1 -1
- package/dist/esm/perspective-viewer.js +9 -9
- package/dist/esm/perspective-viewer.js.map +3 -3
- package/dist/esm/plugin.d.ts +4 -1
- package/dist/esm/select-detail.d.ts +15 -0
- package/dist/esm/select-detail.js +2 -0
- package/dist/esm/select-detail.js.map +7 -0
- package/dist/esm/ts-rs/DerivedTableConfig.d.ts +35 -0
- package/dist/esm/ts-rs/PanelViewerConfig.d.ts +7 -6
- package/dist/esm/ts-rs/RestoreOptions.d.ts +3 -7
- package/dist/esm/ts-rs/TableRef.d.ts +9 -0
- package/dist/esm/ts-rs/ViewerConfig.d.ts +7 -6
- package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +7 -5
- package/dist/esm/ts-rs/WorkspaceConfig.d.ts +9 -1
- package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +9 -0
- package/dist/wasm/perspective-viewer.d.ts +115 -35
- package/dist/wasm/perspective-viewer.js +314 -190
- package/dist/wasm/perspective-viewer.wasm +0 -0
- package/dist/wasm/perspective-viewer.wasm.d.ts +21 -17
- package/package.json +31 -18
- package/src/css/column-selector.css +205 -50
- package/src/css/ui/containers/context-menu.css +12 -1
- package/src/css/ui/containers/dropdown-menu-items.css +29 -0
- package/src/css/ui/containers/scroll-panel.css +4 -1
- package/src/rust/agent/client/protocol.rs +0 -89
- package/src/rust/agent/markdown/mod.rs +0 -238
- package/src/rust/agent/preamble.md +1 -0
- package/src/rust/agent/tools.rs +2 -16
- package/src/rust/components/column_selector/active_column.rs +15 -5
- package/src/rust/components/column_selector/add_expression_button.rs +9 -26
- package/src/rust/components/column_selector/config_selector.rs +34 -6
- package/src/rust/components/column_selector/derived_control.rs +229 -0
- package/src/rust/components/column_selector/expr_edit_button.rs +3 -2
- package/src/rust/components/column_selector/filter_column.rs +0 -2
- package/src/rust/components/column_selector/inactive_column.rs +4 -5
- package/src/rust/components/column_selector/pivot_column.rs +21 -1
- package/src/rust/components/column_selector/sort_column.rs +4 -3
- package/src/rust/components/column_selector.rs +21 -1
- package/src/rust/components/column_settings_sidebar/save_settings.rs +5 -3
- package/src/rust/components/column_settings_sidebar/style_tab.rs +1 -0
- package/src/rust/components/column_settings_sidebar.rs +25 -19
- package/src/rust/components/debug_panel.rs +38 -29
- package/src/rust/components/dragdrop_list.rs +8 -9
- package/src/rust/components/main_panel/msg.rs +6 -4
- package/src/rust/components/main_panel/reconcile.rs +6 -1
- package/src/rust/components/main_panel/render.rs +70 -51
- package/src/rust/components/main_panel/update.rs +39 -1
- package/src/rust/components/main_panel.rs +97 -59
- package/src/rust/components/new_panel_menu.rs +69 -1
- package/src/rust/components/panel_menu.rs +63 -12
- package/src/rust/components/plugin_tab.rs +3 -2
- package/src/rust/components/render_warning.rs +2 -1
- package/src/rust/components/settings_panel.rs +4 -4
- package/src/rust/components/status_bar.rs +74 -24
- package/src/rust/components/status_indicator.rs +8 -1
- package/src/rust/components/viewer/filters.rs +13 -1
- package/src/rust/components/viewer/msg.rs +4 -0
- package/src/rust/components/viewer/panels.rs +41 -1
- package/src/rust/components/viewer/render.rs +1 -0
- package/src/rust/components/viewer/settings.rs +0 -22
- package/src/rust/components/viewer/snapshots.rs +2 -2
- package/src/rust/components/viewer/wiring.rs +14 -0
- package/src/rust/components/viewer.rs +45 -25
- package/src/rust/components/window_editor.rs +5 -4
- package/src/rust/config/column_config_schema.rs +38 -377
- package/src/rust/config/number_string_format.rs +0 -94
- package/src/rust/config/options.rs +3 -7
- package/src/rust/config/plugin_static_config.rs +0 -42
- package/src/rust/config/viewer_config.rs +47 -17
- package/src/rust/config/workspace_config.rs +158 -128
- package/src/rust/custom_elements/viewer.rs +187 -131
- package/src/rust/custom_events.rs +33 -18
- package/src/rust/derived.rs +266 -0
- package/src/rust/exprtk/tokenize.rs +0 -54
- package/src/rust/js/plugin.rs +1 -1
- package/src/rust/lib.rs +3 -0
- package/src/rust/presentation.rs +23 -4
- package/src/rust/queries/column_locator.rs +55 -48
- package/src/rust/queries/get_viewer_config.rs +1 -1
- package/src/rust/queries/plugin_column_styles.rs +22 -23
- package/src/rust/renderer/dispatch.rs +2 -0
- package/src/rust/renderer/plugin_config.rs +652 -487
- package/src/rust/renderer/props.rs +4 -0
- package/src/rust/renderer/registry.rs +2 -6
- package/src/rust/renderer/state.rs +205 -0
- package/src/rust/renderer.rs +201 -59
- package/src/rust/session/metadata.rs +30 -9
- package/src/rust/session/op_queue.rs +430 -0
- package/src/rust/session/panel_state.rs +327 -0
- package/src/rust/session/view_subscription.rs +42 -3
- package/src/rust/session.rs +900 -395
- package/src/rust/tasks/apply_global_filters.rs +49 -35
- package/src/rust/tasks/auto_pause.rs +22 -12
- package/src/rust/tasks/copy_export.rs +5 -0
- package/src/rust/tasks/create_panel.rs +34 -9
- package/src/rust/tasks/derive.rs +312 -0
- package/src/rust/tasks/mod.rs +6 -2
- package/src/rust/tasks/pipeline.rs +145 -89
- package/src/rust/tasks/reset_all.rs +31 -20
- package/src/rust/tasks/restore_derived.rs +200 -0
- package/src/rust/tasks/restore_panel.rs +153 -141
- package/src/rust/tasks/send_column_config.rs +56 -29
- package/src/rust/tasks/send_plugin_config.rs +52 -23
- package/src/rust/tasks/set_edit_mode.rs +33 -25
- package/src/rust/tasks/sync_update_panels.rs +39 -12
- package/src/rust/tasks/table_lifecycle.rs +70 -34
- package/src/rust/tasks/transactional_restore.rs +387 -0
- package/src/rust/tasks/update_theme.rs +45 -6
- package/src/rust/ui/containers/scroll_panel.rs +17 -10
- package/src/rust/ui/containers/split_panel.rs +0 -41
- package/src/rust/ui/context_menu.rs +157 -18
- package/src/rust/ui/font_loader.rs +23 -35
- package/src/rust/ui/form/mirrored_textarea.rs +0 -12
- package/src/rust/ui/form/multi_stop_gradient_selector.rs +0 -89
- package/src/rust/ui/form/palette_selector.rs +0 -51
- package/src/rust/ui/portal.rs +4 -10
- package/src/rust/utils/browser/mod.rs +2 -3
- package/src/{ts/perspective-viewer.inline.ts → rust/utils/browser/mouse.rs} +11 -10
- package/src/rust/utils/browser/request_animation_frame.rs +27 -8
- package/src/rust/utils/css.rs +0 -360
- package/src/rust/utils/local_fonts.rs +0 -36
- package/src/rust/utils/mod.rs +2 -3
- package/src/rust/utils/modal_position.rs +15 -21
- package/src/rust/utils/{browser/tests/mod.rs → plugin_host_state.rs} +31 -1
- package/src/rust/utils/pubsub.rs +0 -1
- package/src/rust/workspace.rs +187 -140
- package/src/svg/derived.svg +6 -0
- package/src/themes/icons.css +1 -0
- package/src/themes/intl/ar.css +10 -0
- package/src/themes/intl/de.css +10 -0
- package/src/themes/intl/es.css +10 -0
- package/src/themes/intl/fr.css +10 -0
- package/src/themes/intl/ja.css +10 -0
- package/src/themes/intl/pt.css +10 -0
- package/src/themes/intl/zh.css +10 -0
- package/src/themes/intl.css +10 -0
- package/src/ts/extensions.ts +3 -36
- package/src/ts/perspective-viewer.ts +1 -1
- package/src/ts/plugin.ts +4 -1
- package/src/{rust/utils/tests/request_animation_frame.rs → ts/select-detail.ts} +32 -26
- package/src/ts/ts-rs/DerivedTableConfig.ts +22 -0
- package/src/ts/ts-rs/PanelViewerConfig.ts +7 -6
- package/src/ts/ts-rs/RestoreOptions.ts +3 -7
- package/src/ts/ts-rs/TableRef.ts +9 -0
- package/src/ts/ts-rs/ViewerConfig.ts +7 -6
- package/src/ts/ts-rs/ViewerConfigUpdate.ts +7 -5
- package/src/ts/ts-rs/WorkspaceConfig.ts +7 -1
- package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +7 -0
- package/dist/esm/perspective-viewer.inline.d.ts +0 -3
- package/dist/esm/perspective-viewer.inline.js +0 -21
- package/dist/esm/perspective-viewer.inline.js.map +0 -7
- package/src/rust/tasks/restore_and_render.rs +0 -107
- package/src/rust/utils/browser/tests/debounce.rs +0 -163
- package/src/rust/utils/tests/mod.rs +0 -14
- package/src/rust/utils/tests/pubsub.rs +0 -95
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline0.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline1.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline2.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline3.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline4.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline5.js +0 -0
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
-
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
-
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
-
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
-
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
-
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
-
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
-
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
-
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
-
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
-
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
-
|
|
13
|
-
use futures::Future;
|
|
14
|
-
use perspective_client::clone;
|
|
15
|
-
|
|
16
|
-
use super::pipeline::{RunOrigin, RunSpec, locked_run};
|
|
17
|
-
use super::update_theme::seed_panel_theme;
|
|
18
|
-
use crate::config::{OptionalUpdate, ViewerConfigUpdate};
|
|
19
|
-
use crate::presentation::Presentation;
|
|
20
|
-
use crate::renderer::Renderer;
|
|
21
|
-
use crate::session::Session;
|
|
22
|
-
use crate::*;
|
|
23
|
-
|
|
24
|
-
/// Apply a full [`ViewerConfigUpdate`] (theme, title, plugin selection,
|
|
25
|
-
/// plugin config, columns config, view config) to the engines and re-draw.
|
|
26
|
-
/// Returns an [`ApiFuture<()>`] which resolves when the draw completes.
|
|
27
|
-
pub fn restore_and_render(
|
|
28
|
-
session: &Session,
|
|
29
|
-
renderer: &Renderer,
|
|
30
|
-
presentation: &Presentation,
|
|
31
|
-
origin: RunOrigin,
|
|
32
|
-
ViewerConfigUpdate {
|
|
33
|
-
plugin,
|
|
34
|
-
plugin_config,
|
|
35
|
-
columns_config,
|
|
36
|
-
settings,
|
|
37
|
-
theme: theme_name,
|
|
38
|
-
title,
|
|
39
|
-
mut view_config,
|
|
40
|
-
..
|
|
41
|
-
}: ViewerConfigUpdate,
|
|
42
|
-
task: impl Future<Output = Result<(), ApiError>> + 'static,
|
|
43
|
-
) -> ApiFuture<()> {
|
|
44
|
-
clone!(session, renderer, presentation);
|
|
45
|
-
ApiFuture::new(async move {
|
|
46
|
-
if let OptionalUpdate::Update(x) = settings {
|
|
47
|
-
presentation.set_settings_attribute(x);
|
|
48
|
-
presentation.set_settings_before_open(x);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if let OptionalUpdate::Update(title) = title {
|
|
52
|
-
session.set_title(Some(title));
|
|
53
|
-
} else if matches!(title, OptionalUpdate::SetDefault) {
|
|
54
|
-
session.set_title(None);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
match theme_name {
|
|
58
|
-
OptionalUpdate::SetDefault => {
|
|
59
|
-
let current_name = presentation.get_selected_theme_name().await;
|
|
60
|
-
if current_name.is_some() {
|
|
61
|
-
presentation.set_theme_name(None).await?;
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
OptionalUpdate::Update(x) => {
|
|
65
|
-
presentation.set_theme_name(Some(&x)).await?;
|
|
66
|
-
},
|
|
67
|
-
_ => {},
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
let resolved_plugin = renderer.resolve_plugin_update(&plugin);
|
|
71
|
-
if let Some((_, metadata)) = &resolved_plugin {
|
|
72
|
-
session.set_update_column_defaults(&mut view_config, metadata);
|
|
73
|
-
} else {
|
|
74
|
-
let metadata = if renderer.active_plugin().is_none() {
|
|
75
|
-
renderer
|
|
76
|
-
.resolve_plugin_update(&OptionalUpdate::SetDefault)
|
|
77
|
-
.map(|(_, metadata)| metadata)
|
|
78
|
-
.unwrap_or_else(|| renderer.metadata())
|
|
79
|
-
} else {
|
|
80
|
-
renderer.metadata()
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
session.set_update_rollup_defaults(&mut view_config, &metadata);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
let plugin_idx = resolved_plugin.map(|(idx, _)| idx);
|
|
87
|
-
session.commit_view_config(view_config)?;
|
|
88
|
-
let _run_token = session.begin_config_run();
|
|
89
|
-
seed_panel_theme(&presentation, &renderer).await;
|
|
90
|
-
locked_run(&session, &renderer, RunSpec {
|
|
91
|
-
origin,
|
|
92
|
-
plugin_idx,
|
|
93
|
-
plugin_config,
|
|
94
|
-
columns_config,
|
|
95
|
-
task: Some(Box::pin(task)),
|
|
96
|
-
presentation: Some(presentation.clone()),
|
|
97
|
-
})
|
|
98
|
-
.await?;
|
|
99
|
-
|
|
100
|
-
if renderer.needs_restyle() {
|
|
101
|
-
renderer.restyle_all().await?;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
presentation.publish_theme_config().await?;
|
|
105
|
-
Ok(())
|
|
106
|
-
})
|
|
107
|
-
}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
-
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
-
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
-
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
-
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
-
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
-
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
-
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
-
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
-
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
-
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
-
|
|
13
|
-
use std::cell::Cell;
|
|
14
|
-
use std::rc::Rc;
|
|
15
|
-
|
|
16
|
-
use futures::channel::oneshot::*;
|
|
17
|
-
use futures::future::join_all;
|
|
18
|
-
use wasm_bindgen_futures::spawn_local;
|
|
19
|
-
use wasm_bindgen_test::*;
|
|
20
|
-
|
|
21
|
-
use super::super::request_animation_frame::set_timeout;
|
|
22
|
-
use crate::utils::debounce::*;
|
|
23
|
-
|
|
24
|
-
#[wasm_bindgen_test]
|
|
25
|
-
pub async fn test_lock() {
|
|
26
|
-
let debounce_mutex = DebounceMutex::default();
|
|
27
|
-
let cell = Rc::new(Cell::new(0));
|
|
28
|
-
let (sender, receiver) = channel::<bool>();
|
|
29
|
-
spawn_local({
|
|
30
|
-
let cell = cell.clone();
|
|
31
|
-
let debounce_mutex = debounce_mutex.clone();
|
|
32
|
-
async move {
|
|
33
|
-
debounce_mutex
|
|
34
|
-
.lock(async {
|
|
35
|
-
cell.set(1);
|
|
36
|
-
set_timeout(10).await.unwrap();
|
|
37
|
-
cell.set(2);
|
|
38
|
-
})
|
|
39
|
-
.await
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
spawn_local({
|
|
44
|
-
let cell = cell.clone();
|
|
45
|
-
let debounce_mutex = debounce_mutex.clone();
|
|
46
|
-
async move {
|
|
47
|
-
debounce_mutex
|
|
48
|
-
.lock(async {
|
|
49
|
-
for _ in 0..10 {
|
|
50
|
-
set_timeout(1).await.unwrap();
|
|
51
|
-
if cell.get() == 1 {
|
|
52
|
-
sender.send(false).unwrap();
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
sender.send(cell.get() == 2).unwrap();
|
|
57
|
-
})
|
|
58
|
-
.await
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
assert!(receiver.await.unwrap());
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
#[wasm_bindgen_test]
|
|
66
|
-
pub async fn test_lock_seq() {
|
|
67
|
-
let debounce_mutex = DebounceMutex::default();
|
|
68
|
-
let cell: Rc<Cell<u32>> = Rc::new(Cell::new(0));
|
|
69
|
-
|
|
70
|
-
let tasks = (0..10)
|
|
71
|
-
.map(|_| {
|
|
72
|
-
let cell = cell.clone();
|
|
73
|
-
let debounce_mutex = debounce_mutex.clone();
|
|
74
|
-
async move {
|
|
75
|
-
debounce_mutex
|
|
76
|
-
.lock(async {
|
|
77
|
-
set_timeout(10).await.unwrap();
|
|
78
|
-
cell.set(cell.get() + 1);
|
|
79
|
-
})
|
|
80
|
-
.await;
|
|
81
|
-
}
|
|
82
|
-
})
|
|
83
|
-
.collect::<Vec<_>>();
|
|
84
|
-
|
|
85
|
-
assert_eq!(join_all(tasks).await.len(), 10);
|
|
86
|
-
assert_eq!(cell.get(), 10);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/// A dedicated [`DebounceSlot`]'s task must RUN even when the default slot
|
|
90
|
-
/// has a parked runner — coalescing is scoped per slot. Pre-slot (one
|
|
91
|
-
/// shared parked flag), `t4` would resolve via `t2`'s settle without its
|
|
92
|
-
/// closure ever running: the resize-eaten-by-parked-update bug.
|
|
93
|
-
#[wasm_bindgen_test]
|
|
94
|
-
pub async fn test_slot_isolated_from_default_coalescing() {
|
|
95
|
-
let debounce_mutex = DebounceMutex::default();
|
|
96
|
-
let slot = debounce_mutex.slot();
|
|
97
|
-
let defaults: Rc<Cell<u32>> = Rc::new(Cell::new(0));
|
|
98
|
-
let slots: Rc<Cell<u32>> = Rc::new(Cell::new(0));
|
|
99
|
-
|
|
100
|
-
let t1 = debounce_mutex.lock(async {
|
|
101
|
-
set_timeout(10).await.unwrap();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
let t2 = {
|
|
105
|
-
let defaults = defaults.clone();
|
|
106
|
-
debounce_mutex.debounce(async move {
|
|
107
|
-
defaults.set(defaults.get() + 1);
|
|
108
|
-
Ok(())
|
|
109
|
-
})
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
let t3 = {
|
|
113
|
-
let defaults = defaults.clone();
|
|
114
|
-
debounce_mutex.debounce(async move {
|
|
115
|
-
defaults.set(defaults.get() + 100);
|
|
116
|
-
Ok(())
|
|
117
|
-
})
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
let t4 = {
|
|
121
|
-
let slots = slots.clone();
|
|
122
|
-
slot.debounce_with(|_| async move {
|
|
123
|
-
slots.set(slots.get() + 1);
|
|
124
|
-
Ok(())
|
|
125
|
-
})
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
let (_, r2, r3, r4) = futures::join!(t1, t2, t3, t4);
|
|
129
|
-
r2.unwrap();
|
|
130
|
-
r3.unwrap();
|
|
131
|
-
r4.unwrap();
|
|
132
|
-
|
|
133
|
-
// `t3` coalesced onto the parked `t2`; `t4` ran its own closure.
|
|
134
|
-
assert_eq!(defaults.get(), 1);
|
|
135
|
-
assert_eq!(slots.get(), 1);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
#[wasm_bindgen_test]
|
|
139
|
-
pub async fn test_debounce_seq() {
|
|
140
|
-
let debounce_mutex = DebounceMutex::default();
|
|
141
|
-
let cell: Rc<Cell<u32>> = Rc::new(Cell::new(0));
|
|
142
|
-
|
|
143
|
-
let tasks = (0..10)
|
|
144
|
-
.map(|_| {
|
|
145
|
-
let cell = cell.clone();
|
|
146
|
-
let debounce_mutex = debounce_mutex.clone();
|
|
147
|
-
async move {
|
|
148
|
-
debounce_mutex
|
|
149
|
-
.debounce(async {
|
|
150
|
-
set_timeout(10).await.unwrap();
|
|
151
|
-
cell.set(cell.get() + 1);
|
|
152
|
-
Ok(())
|
|
153
|
-
})
|
|
154
|
-
.await
|
|
155
|
-
.unwrap();
|
|
156
|
-
}
|
|
157
|
-
})
|
|
158
|
-
.collect::<Vec<_>>();
|
|
159
|
-
|
|
160
|
-
assert_eq!(join_all(tasks).await.len(), 10);
|
|
161
|
-
assert!(cell.get() < 10);
|
|
162
|
-
assert!(cell.get() > 0);
|
|
163
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
-
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
-
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
-
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
-
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
-
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
-
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
-
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
-
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
-
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
-
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
-
|
|
13
|
-
mod pubsub;
|
|
14
|
-
mod request_animation_frame;
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
-
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
-
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
-
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
-
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
-
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
-
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
-
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
-
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
-
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
-
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
-
|
|
13
|
-
use std::cell::RefCell;
|
|
14
|
-
use std::rc::Rc;
|
|
15
|
-
|
|
16
|
-
use wasm_bindgen_test::*;
|
|
17
|
-
|
|
18
|
-
use super::super::pubsub::*;
|
|
19
|
-
|
|
20
|
-
#[wasm_bindgen_test]
|
|
21
|
-
pub async fn test_pub_sub() {
|
|
22
|
-
let pubsub: PubSub<u32> = PubSub::default();
|
|
23
|
-
let called: Rc<RefCell<Option<u32>>> = Rc::new(RefCell::new(None));
|
|
24
|
-
let callback = {
|
|
25
|
-
let called = called.clone();
|
|
26
|
-
move |x| {
|
|
27
|
-
*called.borrow_mut() = Some(x);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
let sub = pubsub.add_listener(callback);
|
|
32
|
-
pubsub.emit(1);
|
|
33
|
-
assert_eq!(*called.borrow(), Some(1));
|
|
34
|
-
drop(sub);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
#[wasm_bindgen_test]
|
|
38
|
-
pub async fn test_pub_sub_multiple() {
|
|
39
|
-
let pubsub: PubSub<u32> = PubSub::default();
|
|
40
|
-
let called1: Rc<RefCell<Option<u32>>> = Rc::new(RefCell::new(None));
|
|
41
|
-
let called2: Rc<RefCell<Option<u32>>> = Rc::new(RefCell::new(None));
|
|
42
|
-
let callback1 = {
|
|
43
|
-
let called = called1.clone();
|
|
44
|
-
move |x| {
|
|
45
|
-
*called.borrow_mut() = Some(x);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
let callback2 = {
|
|
50
|
-
let called = called2.clone();
|
|
51
|
-
move |x| {
|
|
52
|
-
*called.borrow_mut() = Some(x);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Must be in scope or subscriptions will drop immediately!
|
|
57
|
-
let sub1 = pubsub.add_listener(callback1);
|
|
58
|
-
let sub2 = pubsub.add_listener(callback2);
|
|
59
|
-
|
|
60
|
-
pubsub.emit(1);
|
|
61
|
-
assert_eq!(*called1.borrow(), Some(1));
|
|
62
|
-
assert_eq!(*called2.borrow(), Some(1));
|
|
63
|
-
|
|
64
|
-
drop(sub1);
|
|
65
|
-
drop(sub2);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
#[wasm_bindgen_test]
|
|
69
|
-
pub async fn test_pub_sub_multiple_drop_first() {
|
|
70
|
-
let pubsub: PubSub<u32> = PubSub::default();
|
|
71
|
-
let called1: Rc<RefCell<Option<u32>>> = Rc::new(RefCell::new(None));
|
|
72
|
-
let called2: Rc<RefCell<Option<u32>>> = Rc::new(RefCell::new(None));
|
|
73
|
-
let callback1 = {
|
|
74
|
-
let called = called1.clone();
|
|
75
|
-
move |x| {
|
|
76
|
-
*called.borrow_mut() = Some(x);
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
let callback2 = {
|
|
81
|
-
let called = called2.clone();
|
|
82
|
-
move |x| {
|
|
83
|
-
*called.borrow_mut() = Some(x);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
let _ = pubsub.add_listener(callback1);
|
|
88
|
-
let sub = pubsub.add_listener(callback2);
|
|
89
|
-
|
|
90
|
-
pubsub.emit(1);
|
|
91
|
-
assert_eq!(*called1.borrow(), None);
|
|
92
|
-
assert_eq!(*called2.borrow(), Some(1));
|
|
93
|
-
|
|
94
|
-
drop(sub);
|
|
95
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|