@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.
Files changed (194) hide show
  1. package/README.md +82 -3
  2. package/dist/cdn/perspective-viewer.js +9 -9
  3. package/dist/cdn/perspective-viewer.js.map +3 -3
  4. package/dist/css/blueprint.css +1 -1
  5. package/dist/css/botanical.css +1 -1
  6. package/dist/css/dracula.css +1 -1
  7. package/dist/css/eggplant.css +1 -1
  8. package/dist/css/gruvbox-dark.css +1 -1
  9. package/dist/css/gruvbox.css +1 -1
  10. package/dist/css/icons.css +1 -1
  11. package/dist/css/intl/ar.css +1 -1
  12. package/dist/css/intl/de.css +1 -1
  13. package/dist/css/intl/es.css +1 -1
  14. package/dist/css/intl/fr.css +1 -1
  15. package/dist/css/intl/ja.css +1 -1
  16. package/dist/css/intl/pt.css +1 -1
  17. package/dist/css/intl/zh.css +1 -1
  18. package/dist/css/intl.css +1 -1
  19. package/dist/css/ledger.css +1 -1
  20. package/dist/css/monokai.css +1 -1
  21. package/dist/css/nord.css +1 -1
  22. package/dist/css/phosphor.css +1 -1
  23. package/dist/css/pro-dark.css +1 -1
  24. package/dist/css/pro.css +1 -1
  25. package/dist/css/solarized-dark.css +1 -1
  26. package/dist/css/solarized.css +1 -1
  27. package/dist/css/themes.css +1 -1
  28. package/dist/css/vaporwave.css +1 -1
  29. package/dist/css/velvet.css +1 -1
  30. package/dist/docs/perspective-docs.json +1 -1
  31. package/dist/esm/column-format.js +2 -0
  32. package/dist/esm/column-format.js.map +7 -0
  33. package/dist/esm/extensions.d.ts +3 -13
  34. package/dist/esm/perspective-viewer.d.ts +1 -1
  35. package/dist/esm/perspective-viewer.js +9 -9
  36. package/dist/esm/perspective-viewer.js.map +3 -3
  37. package/dist/esm/plugin.d.ts +4 -1
  38. package/dist/esm/select-detail.d.ts +15 -0
  39. package/dist/esm/select-detail.js +2 -0
  40. package/dist/esm/select-detail.js.map +7 -0
  41. package/dist/esm/ts-rs/DerivedTableConfig.d.ts +35 -0
  42. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +7 -6
  43. package/dist/esm/ts-rs/RestoreOptions.d.ts +3 -7
  44. package/dist/esm/ts-rs/TableRef.d.ts +9 -0
  45. package/dist/esm/ts-rs/ViewerConfig.d.ts +7 -6
  46. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +7 -5
  47. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +9 -1
  48. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +9 -0
  49. package/dist/wasm/perspective-viewer.d.ts +115 -35
  50. package/dist/wasm/perspective-viewer.js +314 -190
  51. package/dist/wasm/perspective-viewer.wasm +0 -0
  52. package/dist/wasm/perspective-viewer.wasm.d.ts +21 -17
  53. package/package.json +31 -18
  54. package/src/css/column-selector.css +205 -50
  55. package/src/css/ui/containers/context-menu.css +12 -1
  56. package/src/css/ui/containers/dropdown-menu-items.css +29 -0
  57. package/src/css/ui/containers/scroll-panel.css +4 -1
  58. package/src/rust/agent/client/protocol.rs +0 -89
  59. package/src/rust/agent/markdown/mod.rs +0 -238
  60. package/src/rust/agent/preamble.md +1 -0
  61. package/src/rust/agent/tools.rs +2 -16
  62. package/src/rust/components/column_selector/active_column.rs +15 -5
  63. package/src/rust/components/column_selector/add_expression_button.rs +9 -26
  64. package/src/rust/components/column_selector/config_selector.rs +34 -6
  65. package/src/rust/components/column_selector/derived_control.rs +229 -0
  66. package/src/rust/components/column_selector/expr_edit_button.rs +3 -2
  67. package/src/rust/components/column_selector/filter_column.rs +0 -2
  68. package/src/rust/components/column_selector/inactive_column.rs +4 -5
  69. package/src/rust/components/column_selector/pivot_column.rs +21 -1
  70. package/src/rust/components/column_selector/sort_column.rs +4 -3
  71. package/src/rust/components/column_selector.rs +21 -1
  72. package/src/rust/components/column_settings_sidebar/save_settings.rs +5 -3
  73. package/src/rust/components/column_settings_sidebar/style_tab.rs +1 -0
  74. package/src/rust/components/column_settings_sidebar.rs +25 -19
  75. package/src/rust/components/debug_panel.rs +38 -29
  76. package/src/rust/components/dragdrop_list.rs +8 -9
  77. package/src/rust/components/main_panel/msg.rs +6 -4
  78. package/src/rust/components/main_panel/reconcile.rs +6 -1
  79. package/src/rust/components/main_panel/render.rs +70 -51
  80. package/src/rust/components/main_panel/update.rs +39 -1
  81. package/src/rust/components/main_panel.rs +97 -59
  82. package/src/rust/components/new_panel_menu.rs +69 -1
  83. package/src/rust/components/panel_menu.rs +63 -12
  84. package/src/rust/components/plugin_tab.rs +3 -2
  85. package/src/rust/components/render_warning.rs +2 -1
  86. package/src/rust/components/settings_panel.rs +4 -4
  87. package/src/rust/components/status_bar.rs +74 -24
  88. package/src/rust/components/status_indicator.rs +8 -1
  89. package/src/rust/components/viewer/filters.rs +13 -1
  90. package/src/rust/components/viewer/msg.rs +4 -0
  91. package/src/rust/components/viewer/panels.rs +41 -1
  92. package/src/rust/components/viewer/render.rs +1 -0
  93. package/src/rust/components/viewer/settings.rs +0 -22
  94. package/src/rust/components/viewer/snapshots.rs +2 -2
  95. package/src/rust/components/viewer/wiring.rs +14 -0
  96. package/src/rust/components/viewer.rs +45 -25
  97. package/src/rust/components/window_editor.rs +5 -4
  98. package/src/rust/config/column_config_schema.rs +38 -377
  99. package/src/rust/config/number_string_format.rs +0 -94
  100. package/src/rust/config/options.rs +3 -7
  101. package/src/rust/config/plugin_static_config.rs +0 -42
  102. package/src/rust/config/viewer_config.rs +47 -17
  103. package/src/rust/config/workspace_config.rs +158 -128
  104. package/src/rust/custom_elements/viewer.rs +187 -131
  105. package/src/rust/custom_events.rs +33 -18
  106. package/src/rust/derived.rs +266 -0
  107. package/src/rust/exprtk/tokenize.rs +0 -54
  108. package/src/rust/js/plugin.rs +1 -1
  109. package/src/rust/lib.rs +3 -0
  110. package/src/rust/presentation.rs +23 -4
  111. package/src/rust/queries/column_locator.rs +55 -48
  112. package/src/rust/queries/get_viewer_config.rs +1 -1
  113. package/src/rust/queries/plugin_column_styles.rs +22 -23
  114. package/src/rust/renderer/dispatch.rs +2 -0
  115. package/src/rust/renderer/plugin_config.rs +652 -487
  116. package/src/rust/renderer/props.rs +4 -0
  117. package/src/rust/renderer/registry.rs +2 -6
  118. package/src/rust/renderer/state.rs +205 -0
  119. package/src/rust/renderer.rs +201 -59
  120. package/src/rust/session/metadata.rs +30 -9
  121. package/src/rust/session/op_queue.rs +430 -0
  122. package/src/rust/session/panel_state.rs +327 -0
  123. package/src/rust/session/view_subscription.rs +42 -3
  124. package/src/rust/session.rs +900 -395
  125. package/src/rust/tasks/apply_global_filters.rs +49 -35
  126. package/src/rust/tasks/auto_pause.rs +22 -12
  127. package/src/rust/tasks/copy_export.rs +5 -0
  128. package/src/rust/tasks/create_panel.rs +34 -9
  129. package/src/rust/tasks/derive.rs +312 -0
  130. package/src/rust/tasks/mod.rs +6 -2
  131. package/src/rust/tasks/pipeline.rs +145 -89
  132. package/src/rust/tasks/reset_all.rs +31 -20
  133. package/src/rust/tasks/restore_derived.rs +200 -0
  134. package/src/rust/tasks/restore_panel.rs +153 -141
  135. package/src/rust/tasks/send_column_config.rs +56 -29
  136. package/src/rust/tasks/send_plugin_config.rs +52 -23
  137. package/src/rust/tasks/set_edit_mode.rs +33 -25
  138. package/src/rust/tasks/sync_update_panels.rs +39 -12
  139. package/src/rust/tasks/table_lifecycle.rs +70 -34
  140. package/src/rust/tasks/transactional_restore.rs +387 -0
  141. package/src/rust/tasks/update_theme.rs +45 -6
  142. package/src/rust/ui/containers/scroll_panel.rs +17 -10
  143. package/src/rust/ui/containers/split_panel.rs +0 -41
  144. package/src/rust/ui/context_menu.rs +157 -18
  145. package/src/rust/ui/font_loader.rs +23 -35
  146. package/src/rust/ui/form/mirrored_textarea.rs +0 -12
  147. package/src/rust/ui/form/multi_stop_gradient_selector.rs +0 -89
  148. package/src/rust/ui/form/palette_selector.rs +0 -51
  149. package/src/rust/ui/portal.rs +4 -10
  150. package/src/rust/utils/browser/mod.rs +2 -3
  151. package/src/{ts/perspective-viewer.inline.ts → rust/utils/browser/mouse.rs} +11 -10
  152. package/src/rust/utils/browser/request_animation_frame.rs +27 -8
  153. package/src/rust/utils/css.rs +0 -360
  154. package/src/rust/utils/local_fonts.rs +0 -36
  155. package/src/rust/utils/mod.rs +2 -3
  156. package/src/rust/utils/modal_position.rs +15 -21
  157. package/src/rust/utils/{browser/tests/mod.rs → plugin_host_state.rs} +31 -1
  158. package/src/rust/utils/pubsub.rs +0 -1
  159. package/src/rust/workspace.rs +187 -140
  160. package/src/svg/derived.svg +6 -0
  161. package/src/themes/icons.css +1 -0
  162. package/src/themes/intl/ar.css +10 -0
  163. package/src/themes/intl/de.css +10 -0
  164. package/src/themes/intl/es.css +10 -0
  165. package/src/themes/intl/fr.css +10 -0
  166. package/src/themes/intl/ja.css +10 -0
  167. package/src/themes/intl/pt.css +10 -0
  168. package/src/themes/intl/zh.css +10 -0
  169. package/src/themes/intl.css +10 -0
  170. package/src/ts/extensions.ts +3 -36
  171. package/src/ts/perspective-viewer.ts +1 -1
  172. package/src/ts/plugin.ts +4 -1
  173. package/src/{rust/utils/tests/request_animation_frame.rs → ts/select-detail.ts} +32 -26
  174. package/src/ts/ts-rs/DerivedTableConfig.ts +22 -0
  175. package/src/ts/ts-rs/PanelViewerConfig.ts +7 -6
  176. package/src/ts/ts-rs/RestoreOptions.ts +3 -7
  177. package/src/ts/ts-rs/TableRef.ts +9 -0
  178. package/src/ts/ts-rs/ViewerConfig.ts +7 -6
  179. package/src/ts/ts-rs/ViewerConfigUpdate.ts +7 -5
  180. package/src/ts/ts-rs/WorkspaceConfig.ts +7 -1
  181. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +7 -0
  182. package/dist/esm/perspective-viewer.inline.d.ts +0 -3
  183. package/dist/esm/perspective-viewer.inline.js +0 -21
  184. package/dist/esm/perspective-viewer.inline.js.map +0 -7
  185. package/src/rust/tasks/restore_and_render.rs +0 -107
  186. package/src/rust/utils/browser/tests/debounce.rs +0 -163
  187. package/src/rust/utils/tests/mod.rs +0 -14
  188. package/src/rust/utils/tests/pubsub.rs +0 -95
  189. /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline0.js +0 -0
  190. /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline1.js +0 -0
  191. /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline2.js +0 -0
  192. /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline3.js +0 -0
  193. /package/dist/wasm/snippets/{perspective-viewer-6813b568219c6763 → perspective-viewer-d0d525977a1acba2}/inline4.js +0 -0
  194. /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
- }