lab42_data_class 0.3.0 → 0.3.1

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: 3c062e2633e5881141e65113d2d60878733611bece697c933876ef1d9f62270e
4
- data.tar.gz: bb5e524274338fda67063a8514cbe17a27c92ec8b62106061793456245729e30
3
+ metadata.gz: 8e4127a34f013386209c71666f9d77e1b5c8fd439324443580e00c7e9018fdb4
4
+ data.tar.gz: c61d6f1648c9c73cd89883a0c0e6ebd6ea813f51dcdb26f141a99a962e4db5fa
5
5
  SHA512:
6
- metadata.gz: ddfaa83d7d62a4f3ccdb6df66cc1b3462ee626ac970b2654e138d338c3e0ba8e016882445552d8fff4ffb13636953f17757991625bc1c54b5b3883c1eed43f89
7
- data.tar.gz: 4dae3c50dc6b01e5f311f61e4f8aaf2b712db66a4ace5172b91df242411246e71dc2b30f29cded81ab5b95c77c0858f81282e72a481aff0921d4dbeea990d2f6
6
+ metadata.gz: 74b643eb6d43c00aedede31195354412a0b7dcabc5f5da0d1c3f5dbfca4dc03abc1b13a68e10307813153b6e8fe0c502a075a9c4ef17c61f1163ec251e03b3f7
7
+ data.tar.gz: '007384216191284048c0fcec62adedb04c8f41a549b92d7cdefcbaa3fa2f4536cce737d4a21a6c8d3648fe62a539fd9f201cd036566b9ff3251ac2929856a6a7'
data/README.md CHANGED
@@ -179,6 +179,37 @@ Then we can access the included method
179
179
  expect(class_level.new.humanize).to eq("my value is 1")
180
180
  ```
181
181
 
182
+ ### Context: Pattern Matching
183
+
184
+ An `DataClass` object behaves like the result of it's `to_h` in pattern matching
185
+
186
+ Given
187
+ ```ruby
188
+ let(:numbers) { DataClass(:name, values: []) }
189
+ let(:odds) { numbers.new(name: "odds", values: (1..4).map{ _1 + _1 + 1}) }
190
+ let(:evens) { numbers.new(name: "evens", values: (1..4).map{ _1 + _1}) }
191
+ ```
192
+
193
+ Then we can match accordingly
194
+ ```ruby
195
+ match = case odds
196
+ in {name: "odds", values: [1, *]}
197
+ :not_really
198
+ in {name: "evens"}
199
+ :still_naaah
200
+ in {name: "odds", values: [hd, *]}
201
+ hd
202
+ else
203
+ :strange
204
+ end
205
+ expect(match).to eq(3)
206
+ ```
207
+
208
+ And in `in` expressions
209
+ ```ruby
210
+ evens => {values: [_, second, *]}
211
+ expect(second).to eq(4)
212
+ ```
182
213
 
183
214
  # LICENSE
184
215
 
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lab42
4
+ module DataClass
5
+ class Proxy
6
+ module Mixin
7
+ def ==(other)
8
+ other.is_a?(self.class) &&
9
+ to_h == other.to_h
10
+ end
11
+
12
+ def deconstruct_keys(*)
13
+ to_h
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'set'
4
+ require_relative 'proxy/mixin'
4
5
  module Lab42
5
6
  module DataClass
6
7
  class Proxy
@@ -16,6 +17,8 @@ module Lab42
16
17
  klass.module_eval(&_define_attr_reader)
17
18
  klass.module_eval(&_define_initializer)
18
19
  _define_methods
20
+ klass.include(Mixin)
21
+ klass.module_eval(&block) if block
19
22
  klass
20
23
  end
21
24
 
@@ -47,15 +50,6 @@ module Lab42
47
50
  end
48
51
  end
49
52
 
50
- def _define_eql?
51
- ->(*) do
52
- define_method :== do |other|
53
- other.is_a?(self.class) &&
54
- to_h == other.to_h
55
- end
56
- end
57
- end
58
-
59
53
  def _define_freezing_constructor
60
54
  ->(*) do
61
55
  define_method :new do |*a, **p, &b|
@@ -89,8 +83,6 @@ module Lab42
89
83
  (class << klass; self end).module_eval(&_define_freezing_constructor)
90
84
  klass.module_eval(&_define_to_h)
91
85
  klass.module_eval(&_define_merge)
92
- klass.module_eval(&_define_eql?)
93
- klass.module_eval(&block) if block
94
86
  end
95
87
 
96
88
  def _define_to_h
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Lab42
4
4
  module DataClass
5
- VERSION = "0.3.0"
5
+ VERSION = "0.3.1"
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: Apache-2.0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lab42_data_class
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-22 00:00:00.000000000 Z
11
+ date: 2022-01-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  An Immutable DataClass for Ruby
@@ -24,6 +24,7 @@ files:
24
24
  - README.md
25
25
  - lib/lab42/data_class.rb
26
26
  - lib/lab42/data_class/proxy.rb
27
+ - lib/lab42/data_class/proxy/mixin.rb
27
28
  - lib/lab42/data_class/version.rb
28
29
  homepage: https://github.com/robertdober/lab42_data_class
29
30
  licenses: