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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 023d2e474c347003b12bef1210945016175838261a5761dae81cb90d749fe51b
4
- data.tar.gz: 04adf75c67d46adf30fabfdf996eea3ef1555678f96189444d32355571c5d12d
3
+ metadata.gz: d07f1ae6a575b06c9831c5a167f69fcc1432a653a907e1cc4ed392271b297e6c
4
+ data.tar.gz: 053fdbe6ce667fee00b58f3ee910b58a7639b44093508dbdf4cc1bcccf09c488
5
5
  SHA512:
6
- metadata.gz: 1c6cc8aad7188bde45f3c5e535d8a7c9ceb17e0598f35ebe45791cf194b8489e799fb32680c130f4bd3f0c06e399ae900bfa8dd103fd7431fe779856fb1685cc
7
- data.tar.gz: e3eacdfae3cecd69c3b17158e4ae5610119d83e778e369479c487a1ac42e88dcb554cb9c3389cf4d1e1689a337f1bab2f0e02230d6a22b59df3b4bb2993069c3
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- signalize (1.1.0)
4
+ signalize (1.2.0)
5
5
  concurrent-ruby (~> 1.2)
6
6
 
7
7
  GEM
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".
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Signalize
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
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
- prevContext = Signalize.eval_context
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 = prevContext
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.1.0
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-03-25 00:00:00.000000000 Z
12
+ date: 2023-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby