accessory 0.1.8 → 0.1.9

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