signalize 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|