accessory 0.1.8 → 0.1.9

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: bad93b39fc1164c938ed170896bfc5d6ef0c7d157a443b05395ef835fcaf6706
4
- data.tar.gz: ac0cdef27d42a339c3b640ee06c8231f4e724b2b2e541eb081bc37d33542fa35
3
+ metadata.gz: c03753edaa94362541af5695a93547b6e1f3565f37aa82e7536b3e81d212eb7c
4
+ data.tar.gz: a3584fbf0b4ee32555feccd642c7225fd6c6f8f85563fcb03b542624f36f7660
5
5
  SHA512:
6
- metadata.gz: ae8c4170a783795b4e436232f1051c7bd3b0ef39132af63fcc0055c27df97eaabcd981f00a338f38bf0a343a582e30db1dc7b2cc4026f07d8dfa93d47177df8c
7
- data.tar.gz: f78e0b73341624deb56871906d2dc33e5791a7514f3c6bd9f3db955c6f7e09e95621827d9a7978ec21f5fb7ff1fbbad764feb271e676525e957355e7dd7b6fe1
6
+ metadata.gz: 61015ff40a150d474e43ec454a4c50cb0fd4021660a10cf65d61cd69ec4abe3293523fa53cceda199da7996ed5bea160efc45bf826724647fbc7020f0c666b57
7
+ data.tar.gz: 3ec8ca3a2f53df27e958621997102d6d10220a15f26c48dc6cdb3f56403f387d629d531433d93f05e6ced2f30ad7d046df0ae27ad620047715b3648bf2ec20dd
@@ -50,17 +50,28 @@ class Accessory::Accessors::AllAccessor < Accessory::Accessor
50
50
  def get_and_update(data)
51
51
  results = []
52
52
  new_data = []
53
+ dirty = false
53
54
 
54
55
  (data || []).each do |pos|
55
56
  case yield(pos)
56
- in [result, new_value]
57
+ in [:clean, result, _]
58
+ results.push(result)
59
+ new_data.push(pos)
60
+ # ok
61
+ in [:dirty, result, new_value]
57
62
  results.push(result)
58
63
  new_data.push(new_value)
64
+ dirty = true
59
65
  in :pop
60
66
  results.push(pos)
67
+ dirty = true
61
68
  end
62
69
  end
63
70
 
64
- [results, new_data]
71
+ if dirty
72
+ [:dirty, results, new_data]
73
+ else
74
+ [:clean, results, data]
75
+ end
65
76
  end
66
77
  end
@@ -88,12 +88,14 @@ class Accessory::Accessors::AttributeAccessor < Accessory::Accessor
88
88
  value = traverse_or_default(data)
89
89
 
90
90
  case yield(value)
91
- in [result, new_value]
91
+ in [:clean, result, _]
92
+ [:clean, result, data]
93
+ in [:dirty, result, new_value]
92
94
  data.send(@setter_method_name, new_value)
93
- [result, data]
95
+ [:dirty, result, data]
94
96
  in :pop
95
97
  data.send(@setter_method_name, nil)
96
- [value, data]
98
+ [:dirty, value, data]
97
99
  end
98
100
  end
99
101
  end
@@ -75,15 +75,20 @@ class Accessory::Accessors::BetweenEachAccessor < Accessory::Accessor
75
75
  def get_and_update(data)
76
76
  results = []
77
77
  new_data = []
78
+ dirty = false
78
79
 
79
80
  positions = traverse_or_default(data || [])
80
81
 
81
82
  positions.each do |pos|
82
83
  case yield(pos)
83
- in [result, new_value]
84
+ in [:clean, result, _]
85
+ results.push(result)
86
+ in [:dirty, result, new_value]
84
87
  new_data.push(new_value)
85
88
  results.push(result)
89
+ dirty = true
86
90
  in :pop
91
+ # ok
87
92
  end
88
93
 
89
94
  unless pos.last?
@@ -91,6 +96,10 @@ class Accessory::Accessors::BetweenEachAccessor < Accessory::Accessor
91
96
  end
92
97
  end
93
98
 
94
- [results, new_data]
99
+ if dirty
100
+ [:dirty, results, new_data]
101
+ else
102
+ [:clean, results, data]
103
+ end
95
104
  end
96
105
  end
@@ -100,12 +100,14 @@ class Accessory::Accessors::BetwixtAccessor < Accessory::Accessor
100
100
  pos = traverse_or_default(data || [])
101
101
 
102
102
  case yield(pos)
103
- in [result, new_value]
103
+ in [:dirty, result, new_value]
104
104
  data ||= []
105
105
  data.insert(@offset, new_value)
106
- [result, data]
106
+ [:dirty, result, data]
107
107
  in :pop
108
- [nil, data]
108
+ [:clean, nil, data]
109
+ in [:clean, result, _]
110
+ [:clean, result, data]
109
111
  end
110
112
  end
111
113
  end
@@ -65,6 +65,7 @@ class Accessory::Accessors::FilterAccessor < Accessory::Accessor
65
65
  def get_and_update(data)
66
66
  results = []
67
67
  new_data = []
68
+ dirty = false
68
69
 
69
70
  (data || []).each do |pos|
70
71
  unless @pred.call(pos)
@@ -73,14 +74,23 @@ class Accessory::Accessors::FilterAccessor < Accessory::Accessor
73
74
  end
74
75
 
75
76
  case yield(pos)
76
- in [result, new_value]
77
+ in [:clean, result, _]
78
+ results.push(result)
79
+ new_data.push(pos)
80
+ in [:dirty, result, new_value]
77
81
  results.push(result)
78
82
  new_data.push(new_value)
83
+ dirty = true
79
84
  in :pop
80
85
  results.push(pos)
86
+ dirty = true
81
87
  end
82
88
  end
83
89
 
84
- [results, new_data]
90
+ if dirty
91
+ [:dirty, results, new_data]
92
+ else
93
+ [:clean, results, data]
94
+ end
85
95
  end
86
96
  end
@@ -58,16 +58,18 @@ class Accessory::Accessors::FirstAccessor < Accessory::Accessor
58
58
  old_value = traverse_or_default(data)
59
59
 
60
60
  case yield(old_value)
61
- in [result, new_value]
61
+ in [:clean, result, _]
62
+ [:clean, result, data]
63
+ in [:dirty, result, new_value]
62
64
  if data.respond_to?(:"first=")
63
65
  data.first = new_value
64
66
  else
65
67
  data[0] = new_value
66
68
  end
67
- [result, data]
69
+ [:dirty, result, data]
68
70
  in :pop
69
71
  data.delete_at(0)
70
- [old_value, data]
72
+ [:dirty, old_value, data]
71
73
  end
72
74
  end
73
75
  end
@@ -70,12 +70,14 @@ class Accessory::Accessors::InstanceVariableAccessor < Accessory::Accessor
70
70
  value = traverse_or_default(data)
71
71
 
72
72
  case yield(value)
73
- in [result, new_value]
73
+ in [:clean, result, _]
74
+ [:clean, result, data]
75
+ in [:dirty, result, new_value]
74
76
  data.instance_variable_set(@ivar_name, new_value)
75
- [result, data]
77
+ [:dirty, result, data]
76
78
  in :pop
77
79
  data.remove_instance_variable(@ivar_name)
78
- [value, data]
80
+ [:dirty, value, data]
79
81
  end
80
82
  end
81
83
  end
@@ -58,16 +58,18 @@ class Accessory::Accessors::LastAccessor < Accessory::Accessor
58
58
  old_value = traverse_or_default(data)
59
59
 
60
60
  case yield(old_value)
61
- in [result, new_value]
61
+ in [:clean, result, _]
62
+ [:clean, result, data]
63
+ in [:dirty, result, new_value]
62
64
  if data.respond_to?(:"last=")
63
65
  data.last = new_value
64
66
  else
65
67
  data[-1] = new_value
66
68
  end
67
- [result, data]
69
+ [:dirty, result, data]
68
70
  in :pop
69
71
  data.delete_at(-1)
70
- [old_value, data]
72
+ [:dirty, old_value, data]
71
73
  end
72
74
  end
73
75
  end
@@ -92,12 +92,14 @@ class Accessory::Accessors::SubscriptAccessor < Accessory::Accessor
92
92
  value = traverse_or_default(data)
93
93
 
94
94
  case yield(value)
95
- in [result, new_value]
95
+ in [:clean, result, _]
96
+ [:clean, result, data]
97
+ in [:dirty, result, new_value]
96
98
  data[@key] = new_value
97
- [result, data]
99
+ [:dirty, result, data]
98
100
  in :pop
99
101
  data.delete(@key)
100
- [value, data]
102
+ [:dirty, value, data]
101
103
  end
102
104
  end
103
105
  end
@@ -164,7 +164,15 @@ class Accessory::Lens
164
164
  # 1. the _old_ value(s) found after all traversals, and
165
165
  # 2. the updated +subject+
166
166
  def update_in(subject, &new_value_fn)
167
- _, new_data = self.get_and_update_in(subject){ |v| [nil, new_value_fn.call(v)] }
167
+ _, _, new_data = self.get_and_update_in(subject) do |v|
168
+ case new_value_fn.call(v)
169
+ in [:set, new_value]
170
+ [:dirty, nil, new_value]
171
+ in :keep
172
+ [:clean, nil, v]
173
+ end
174
+ end
175
+
168
176
  new_data
169
177
  end
170
178
 
@@ -178,7 +186,7 @@ class Accessory::Lens
178
186
  # @param new_value [Object] a replacement value at the traversal position.
179
187
  # @return [Object] the updated +subject+
180
188
  def put_in(subject, new_value)
181
- _, new_data = self.get_and_update_in(subject){ [nil, new_value] }
189
+ _, _, new_data = self.get_and_update_in(subject){ [:dirty, nil, new_value] }
182
190
  new_data
183
191
  end
184
192
 
@@ -191,7 +199,8 @@ class Accessory::Lens
191
199
  # @param subject [Object] the data-structure to traverse
192
200
  # @return [Object] the updated +subject+
193
201
  def pop_in(subject)
194
- self.get_and_update_in(subject){ :pop }
202
+ _, popped_item, new_data = self.get_and_update_in(subject){ :pop }
203
+ [popped_item, new_data]
195
204
  end
196
205
 
197
206
  def append_accessor!(part)
@@ -1,3 +1,3 @@
1
1
  module Accessory
2
- VERSION = "0.1.8"
2
+ VERSION = "0.1.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: accessory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Levi Aul
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-13 00:00:00.000000000 Z
11
+ date: 2021-01-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: