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

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