signalize 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +21 -0
- data/lib/signalize/version.rb +1 -1
- data/lib/signalize.rb +27 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d07f1ae6a575b06c9831c5a167f69fcc1432a653a907e1cc4ed392271b297e6c
|
4
|
+
data.tar.gz: 053fdbe6ce667fee00b58f3ee910b58a7639b44093508dbdf4cc1bcccf09c488
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f2e7666b585b08d1b9e770cd09e558f44fda4bd76be3a58b3355770116ac7e730563b1fba29d273151797ad5efc4aeee8705d195a9d4a21ece91fc247f8f846
|
7
|
+
data.tar.gz: 0d44bbd6f232bb3c9e8f02d99f4d785826cb6ee885bb6be1c43503657dad1c7bbadbc55dc87a24d58d601e534e61497088d6a817b9aaee47808a28463dd4c6bb
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [1.2.0] - 2023-10-03
|
6
|
+
|
7
|
+
- Add `untracked` method (implements #5)
|
8
|
+
- Add `mutation_detected` check for `computed`
|
9
|
+
|
10
|
+
Gem now roughly analogous to `@preact/signals-core` v1.5
|
11
|
+
|
5
12
|
## [1.1.0] - 2023-03-25
|
6
13
|
|
7
14
|
- Provide better signal/computed inspect strings (fixes #1)
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -54,6 +54,27 @@ counter = signal(0)
|
|
54
54
|
counter.value += 1
|
55
55
|
```
|
56
56
|
|
57
|
+
### `untracked { }`
|
58
|
+
|
59
|
+
In case when you're receiving a callback that can read some signals, but you don't want to subscribe to them, you can use `untracked` to prevent any subscriptions from happening.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
require "signalize"
|
63
|
+
include Signalize::API
|
64
|
+
|
65
|
+
counter = signal(0)
|
66
|
+
effect_count = signal(0)
|
67
|
+
fn = proc { effect_count.value + 1 }
|
68
|
+
|
69
|
+
effect do
|
70
|
+
# Logs the value
|
71
|
+
puts counter.value
|
72
|
+
|
73
|
+
# Whenever this effect is triggered, run `fn` that gives new value
|
74
|
+
effect_count.value = untracked(&fn)
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
57
78
|
### `computed { }`
|
58
79
|
|
59
80
|
You derive computed state by accessing a signal's value within a `computed` block and returning a new value. Every time that signal value is updated, a computed value will likewise be updated. Actually, that's not quite accurate — the computed value only computes when it's read. In this sense, we can call computed values "lazily-evaluated".
|
data/lib/signalize/version.rb
CHANGED
data/lib/signalize.rb
CHANGED
@@ -21,6 +21,10 @@ module Signalize
|
|
21
21
|
raise Signalize::Error, "Cycle detected"
|
22
22
|
end
|
23
23
|
|
24
|
+
def self.mutation_detected
|
25
|
+
raise Signalize::Error, "Computed cannot have side-effects"
|
26
|
+
end
|
27
|
+
|
24
28
|
RUNNING = 1 << 0
|
25
29
|
NOTIFIED = 1 << 1
|
26
30
|
OUTDATED = 1 << 2
|
@@ -34,6 +38,10 @@ module Signalize
|
|
34
38
|
global_map_accessor :eval_context
|
35
39
|
self.eval_context = nil
|
36
40
|
|
41
|
+
# Used by `untracked` method
|
42
|
+
global_map_accessor :untracked_depth
|
43
|
+
self.untracked_depth = 0
|
44
|
+
|
37
45
|
# Effects collected into a batch.
|
38
46
|
global_map_accessor :batched_effect
|
39
47
|
self.batched_effect = nil
|
@@ -414,6 +422,8 @@ module Signalize
|
|
414
422
|
end
|
415
423
|
|
416
424
|
def value=(value)
|
425
|
+
Signalize.mutation_detected if Signalize.eval_context.is_a?(Signalize::Computed)
|
426
|
+
|
417
427
|
if value != @value
|
418
428
|
Signalize.cycle_detected if Signalize.batch_iteration > 100
|
419
429
|
|
@@ -484,7 +494,7 @@ module Signalize
|
|
484
494
|
return true
|
485
495
|
end
|
486
496
|
|
487
|
-
|
497
|
+
prev_context = Signalize.eval_context
|
488
498
|
begin
|
489
499
|
Signalize.prepare_sources(self)
|
490
500
|
Signalize.eval_context = self
|
@@ -499,7 +509,7 @@ module Signalize
|
|
499
509
|
@_flags |= HAS_ERROR
|
500
510
|
@_version += 1
|
501
511
|
end
|
502
|
-
Signalize.eval_context =
|
512
|
+
Signalize.eval_context = prev_context
|
503
513
|
Signalize.cleanup_sources(self)
|
504
514
|
@_flags &= ~RUNNING
|
505
515
|
|
@@ -667,6 +677,21 @@ module Signalize
|
|
667
677
|
Signalize.end_batch
|
668
678
|
end
|
669
679
|
end
|
680
|
+
|
681
|
+
def untracked
|
682
|
+
return yield unless Signalize.untracked_depth.zero?
|
683
|
+
|
684
|
+
prev_context = Signalize.eval_context
|
685
|
+
Signalize.eval_context = nil
|
686
|
+
Signalize.untracked_depth += 1
|
687
|
+
|
688
|
+
begin
|
689
|
+
return yield
|
690
|
+
ensure
|
691
|
+
Signalize.untracked_depth -= 1
|
692
|
+
Signalize.eval_context = prev_context
|
693
|
+
end
|
694
|
+
end
|
670
695
|
end
|
671
696
|
|
672
697
|
extend API
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signalize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared White
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-10-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|