hyper-state 1.0.alpha1.1 → 1.0.alpha1.2

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: eb10ec05b438da9beead09918566a05d03ad119dd9711507ea6073e7dd08bc12
4
- data.tar.gz: 55bff91b14d242a57e1792deafcfe8204ca773c782f918fe005161ab28fac267
3
+ metadata.gz: 8a4e6861713a026b7878443bedaf51619c9c7152b62bc4a588d6ebd2744c6cb5
4
+ data.tar.gz: 0d4bb03e324e82feb7b59706a8a07fa51eaae50ecbf2069ae6db37307c14056c
5
5
  SHA512:
6
- metadata.gz: 6f44826d393b99865fb6d5501d5beffbf7e01152557e19bd4e5269599b57b14cd52cba54e9de50f8446c10e950403c37d722997094866fe910dc8b5263d58b9a
7
- data.tar.gz: 1bdce0a88d8c6307bea7ca9e1e286f547bc5927daf4eeff744bb06ee8b82fc4366a9baa1eb0753f7bf65f1c4781784a5a8acd1bfa86385867e23fca87d70aff8
6
+ metadata.gz: '09092aa06c724440995f34445310cdf526f0c03003c6fd5fee9b7b0af0dd9eb30534c3674a6ce7a967251bd0359a888d79c5f7a1993c8086e17013fef15a44ff'
7
+ data.tar.gz: '0081a14b941ccda9fcc54c5b2079e7dd384a9c20cac6ebbeb2884e151fd8803b26a90b77c619e3786c2dc2ce049954b5446ad060e925545100aaf6943a427447'
@@ -5,6 +5,7 @@ require 'hyperstack/internal/callbacks'
5
5
  require 'hyperstack/internal/auto_unmount'
6
6
 
7
7
  require 'hyperstack/internal/state/mapper'
8
+ require 'hyperstack/internal/state/variable'
8
9
  require 'hyperstack/internal/auto_unmount'
9
10
  require 'hyperstack/internal/receiver'
10
11
  require 'hyperstack/state/observable'
@@ -0,0 +1,174 @@
1
+ module Hyperstack
2
+ module Internal
3
+ module State
4
+ module Variable
5
+ class << self
6
+ def legacy_map
7
+ @legacy_map ||= Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = Array.new }}
8
+ end
9
+
10
+ def get(obj, name)
11
+ map_object = legacy_map[obj][name]
12
+ Hyperstack::Internal::State::Mapper.observed!(map_object.object_id)
13
+ map_object[0]
14
+ end
15
+
16
+ def set(obj, name, value)
17
+ map_object = legacy_map[obj][name]
18
+ map_object[0] = value
19
+ Hyperstack::Internal::State::Mapper.mutated!(map_object.object_id)
20
+ value
21
+ end
22
+
23
+ def observed?(obj, name)
24
+ map_object = legacy_map[obj][name]
25
+ Hyperstack::Internal::State::Mapper.observed?(map_object.object_id)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ # ALWAYS_UPDATE_STATE_AFTER_RENDER = Hyperstack.on_client? # if on server then we don't wait to update the state
34
+ # @rendering_level = 0
35
+ #
36
+ # class << self
37
+ # attr_reader :current_observer
38
+ #
39
+ # def has_observers?(object, name)
40
+ # !observers_by_name[object][name].empty?
41
+ # end
42
+ #
43
+ # def bulk_update
44
+ # saved_bulk_update_flag = @bulk_update_flag
45
+ # @bulk_update_flag = true
46
+ # yield
47
+ # ensure
48
+ # @bulk_update_flag = saved_bulk_update_flag
49
+ # end
50
+ #
51
+ # def set_state2(object, name, value, updates, exclusions = nil)
52
+ # # set object's name state to value, tell all observers it has changed.
53
+ # # Observers must implement update_react_js_state
54
+ # object_needs_notification = object.respond_to?(:update_react_js_state)
55
+ # observers_by_name[object][name].dup.each do |observer|
56
+ # next if exclusions && exclusions.include?(observer)
57
+ # updates[observer] += [object, name, value]
58
+ # object_needs_notification = false if object == observer
59
+ # end
60
+ # updates[object] += [nil, name, value] if object_needs_notification
61
+ # end
62
+ #
63
+ # def initialize_states(object, initial_values) # initialize objects' name/value pairs
64
+ # states[object].merge!(initial_values || {})
65
+ # end
66
+ #
67
+ # def get_state(object, name, current_observer = @current_observer)
68
+ # # get current value of name for object, remember that the current object depends on this state,
69
+ # # current observer can be overriden with last param
70
+ # if current_observer && !new_observers[current_observer][object].include?(name)
71
+ # new_observers[current_observer][object] << name
72
+ # end
73
+ # if @delayed_updates && @delayed_updates[object][name]
74
+ # @delayed_updates[object][name][1] << current_observer
75
+ # end
76
+ # states[object][name]
77
+ # end
78
+ #
79
+ # # ReactDOM.unstable_batchedUpdates does not seem to improve things here, ill leave it here commented for reference
80
+ # # and later investigation
81
+ # #if `ReactDOM.unstable_batchedUpdates !== undefined`
82
+ # # %x{
83
+ # # ReactDOM.unstable_batchedUpdates(function(){
84
+ # # #{updates.each { |observer, args| observer.update_react_js_state(*args) }}
85
+ # # });
86
+ # # }
87
+ # #else # run the other one
88
+ # def set_state(object, name, value, delay=ALWAYS_UPDATE_STATE_AFTER_RENDER)
89
+ # states[object][name] = value
90
+ # delay = false if object.respond_to?(:set_state_synchronously?) && object.set_state_synchronously?
91
+ # if delay || @bulk_update_flag
92
+ # @delayed_updates ||= Hash.new { |h, k| h[k] = {} }
93
+ # @delayed_updates[object][name] = [value, Set.new]
94
+ # @delayed_updater ||= after(0.001) do
95
+ # delayed_updates = @delayed_updates
96
+ # @delayed_updates = Hash.new { |h, k| h[k] = {} } # could this be nil???
97
+ # @delayed_updater = nil
98
+ # updates = Hash.new { |hash, key| hash[key] = Array.new }
99
+ # delayed_updates.each do |object, name_hash|
100
+ # name_hash.each do |name, value_and_set|
101
+ # set_state2(object, name, value_and_set[0], updates, value_and_set[1])
102
+ # end
103
+ # end
104
+ # updates.each { |observer, args| observer.update_react_js_state(*args) }
105
+ # end
106
+ # elsif @rendering_level == 0
107
+ # updates = Hash.new { |hash, key| hash[key] = Array.new }
108
+ # set_state2(object, name, value, updates)
109
+ # updates.each { |observer, args| observer.update_react_js_state(*args) }
110
+ # end
111
+ # value
112
+ # end
113
+ #
114
+ # def will_be_observing?(object, name, current_observer)
115
+ # current_observer && new_observers[current_observer][object].include?(name)
116
+ # end
117
+ #
118
+ # def is_observing?(object, name, current_observer)
119
+ # current_observer && observers_by_name[object][name].include?(current_observer)
120
+ # end
121
+ #
122
+ # def update_states_to_observe(current_observer = @current_observer) # should be called after the last after_render callback, currently called after components render method
123
+ # raise "update_states_to_observer called outside of watch block" unless current_observer
124
+ # current_observers[current_observer].each do |object, names|
125
+ # names.each do |name|
126
+ # observers_by_name[object][name].delete(current_observer)
127
+ # end
128
+ # end
129
+ # observers = current_observers[current_observer] = new_observers[current_observer]
130
+ # new_observers.delete(current_observer)
131
+ # observers.each do |object, names|
132
+ # names.each do |name|
133
+ # observers_by_name[object][name] << current_observer
134
+ # end
135
+ # end
136
+ # end
137
+ #
138
+ # def remove # call after component is unmounted
139
+ # raise "remove called outside of watch block" unless @current_observer
140
+ # current_observers[@current_observer].each do |object, names|
141
+ # names.each do |name|
142
+ # observers_by_name[object][name].delete(@current_observer)
143
+ # end
144
+ # end
145
+ # current_observers.delete(@current_observer)
146
+ # end
147
+ #
148
+ # def set_state_context_to(observer, rendering = nil) # wrap all execution that may set or get states in a block so we know which observer is executing
149
+ # saved_current_observer = @current_observer
150
+ # @current_observer = observer
151
+ # @rendering_level += 1 if rendering
152
+ # return_value = yield
153
+ # return_value
154
+ # ensure
155
+ # @current_observer = saved_current_observer
156
+ # @rendering_level -= 1 if rendering
157
+ # return_value
158
+ # end
159
+ #
160
+ # def states
161
+ # @states ||= Hash.new { |h, k| h[k] = {} }
162
+ # end
163
+ #
164
+ # [:new_observers, :current_observers, :observers_by_name].each do |method_name|
165
+ # define_method(method_name) do
166
+ # instance_variable_get("@#{method_name}") ||
167
+ # instance_variable_set("@#{method_name}", Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } })
168
+ # end
169
+ # end
170
+ # end
171
+ # end
172
+ # end
173
+ # end
174
+ # end
@@ -22,6 +22,13 @@ module Hyperstack
22
22
  Internal::State::Mapper.mutated! self
23
23
  result
24
24
  end
25
+ base.send(:"define_#{kind}", :toggle) do |var|
26
+ # @var = !@var
27
+ var = "@#{var}"
28
+ result = instance_variable_set(var, !instance_variable_get(var))
29
+ Internal::State::Mapper.mutated! self
30
+ result
31
+ end
25
32
  if RUBY_ENGINE == 'opal'
26
33
  base.send(:"define_#{kind}", :set) do |var|
27
34
  if Hyperstack.naming_convention == :prefix_state
@@ -1,5 +1,5 @@
1
1
  module Hyperstack
2
2
  module State
3
- VERSION = '1.0.alpha1.1'
3
+ VERSION = '1.0.alpha1.2'
4
4
  end
5
5
  end
data/notes.md CHANGED
@@ -1,6 +1,6 @@
1
1
  typically we see this:
2
2
 
3
- `State.get_state(obj_or_class, key)` and `State.set_state(obj_or_class, key, val)`
3
+ `State::Variable.get(obj_or_class, key)` and `State::Variable.set(obj_or_class, key, val)`
4
4
 
5
5
  we would like to see this:
6
6
 
@@ -66,11 +66,11 @@ internally without reaction
66
66
  so one approach would be to just provide two methods: `observed!` and `mutated!`
67
67
  ```ruby
68
68
  def observed!
69
- State.get_state(self, self)
69
+ State::Variable.get(self, self)
70
70
  end
71
71
 
72
72
  def mutated!
73
- State.set_state(self, self, self)
73
+ State::Variable.set(self, self, self)
74
74
  end
75
75
  ```
76
76
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-state
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.alpha1.1
4
+ version: 1.0.alpha1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitch VanDuyn
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2018-11-14 00:00:00.000000000 Z
13
+ date: 2018-11-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hyperstack-config
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.alpha1.1
21
+ version: 1.0.alpha1.2
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.0.alpha1.1
28
+ version: 1.0.alpha1.2
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: opal
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -80,28 +80,28 @@ dependencies:
80
80
  requirements:
81
81
  - - '='
82
82
  - !ruby/object:Gem::Version
83
- version: 1.0.alpha1.1
83
+ version: 1.0.alpha1.2
84
84
  type: :development
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - '='
89
89
  - !ruby/object:Gem::Version
90
- version: 1.0.alpha1.1
90
+ version: 1.0.alpha1.2
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: hyper-spec
93
93
  requirement: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - '='
96
96
  - !ruby/object:Gem::Version
97
- version: 1.0.alpha1.1
97
+ version: 1.0.alpha1.2
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - '='
103
103
  - !ruby/object:Gem::Version
104
- version: 1.0.alpha1.1
104
+ version: 1.0.alpha1.2
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: listen
107
107
  requirement: !ruby/object:Gem::Requirement
@@ -352,6 +352,7 @@ files:
352
352
  - lib/hyperstack/internal/callbacks.rb
353
353
  - lib/hyperstack/internal/receiver.rb
354
354
  - lib/hyperstack/internal/state/mapper.rb
355
+ - lib/hyperstack/internal/state/variable.rb
355
356
  - lib/hyperstack/state/observable.rb
356
357
  - lib/hyperstack/state/observer.rb
357
358
  - lib/hyperstack/state/version.rb