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 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