rstructural 0.1.2 → 0.2.0

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: fc8f95857064c7ea8117d34867bf68c59162e2e6315b3961fdc7f7ec62aeba03
4
- data.tar.gz: 794a7abee762cdf543bc05782185ac81e7664355f74113a47525f8ea6e459216
3
+ metadata.gz: 2127165f6a372306fb6f9e518457b57705636560c187ff59aa85418d41c4c725
4
+ data.tar.gz: cfc374a5b5a5694719ffb3a9142d2d5990bb8c21df3c48a47168e253e0a3bd2a
5
5
  SHA512:
6
- metadata.gz: 627653a650eb6431832554f1dba31535bbeeb7fa9dea2c8d3f71d8e02e838a50a52c199f3e6239ad2da86c5f29e2c8fd39428f003b68ba2b100091ecb30d1bdd
7
- data.tar.gz: 78a6133b2a328d78375eaf1eb84f2502049dcf9f2b2408a49cff6647aafd4d1ae1512cba26730c959c565f096be5fd395448b3b0bed91497c126a9f4ad602f50
6
+ metadata.gz: 85a86e425fc24176d3019c2694cf9ea942b806292b8a61a86e106c5adcb4200722199d95e6ba2bf0ba0b79f29c723176953e7de8e3a44e2d9e8b1a5914826e77
7
+ data.tar.gz: 27efa42db6472c158a3c28df59ae3ab80863bbcb20b4e8f824aa6a539524ad5711aec5b495ba659273de25488adeb7b04aee9574940f341678be88ff3e860986
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rstructural (0.1.1)
4
+ rstructural (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -129,12 +129,24 @@ module AdtSample
129
129
  end
130
130
  end
131
131
 
132
+ # define common interface
133
+ interface do
134
+ def is_circle?
135
+ case self
136
+ in Circle
137
+ true
138
+ else
139
+ false
140
+ end
141
+ end
142
+ end
132
143
  end
133
144
 
134
145
  puts Shape::Point #=> AdtSample::Shape::Point
135
146
  puts Shape::Rectangle.new(3, 4) #=> AdtSample::Shape::Rectangle(width: 3, height: 4)
136
147
  puts Shape::Rectangle.new(3, 4).area #=> 12
137
148
  puts Shape::Circle.new(5).scale(2).area #=> 314.0
149
+ puts Shape::Circle.is_circle? #=> true
138
150
 
139
151
  case Shape::Rectangle.new(1, 2)
140
152
  in Shape::Rectangle[Integer => i, Integer => j] if j % 2 == 0
@@ -4,7 +4,7 @@ require_relative './struct'
4
4
 
5
5
  module Rstructural::ADT
6
6
  def self.extended(klass)
7
- @@adt_types ||= []
7
+ klass.class_variable_set(:@@adt_types, [])
8
8
  end
9
9
 
10
10
  def const(value = nil, &block)
@@ -13,7 +13,7 @@ module Rstructural::ADT
13
13
  else
14
14
  Rstructural::Struct.new(__caller: caller, &block).new
15
15
  end.tap do |k|
16
- @@adt_types << k
16
+ self.class_variable_get(:@@adt_types) << k
17
17
  def k.name
18
18
  self.class.name
19
19
  end
@@ -21,6 +21,17 @@ module Rstructural::ADT
21
21
  end
22
22
 
23
23
  def data(*fields, &block)
24
- Rstructural::Struct.new(*fields, __caller: caller, &block).tap { |k| @@adt_types << k.name }
24
+ Rstructural::Struct.new(*fields, __caller: caller, &block).tap { |k| self.class_variable_get(:@@adt_types) << k }
25
+ end
26
+
27
+ def interface(&block)
28
+ self.class_variable_get(:@@adt_types).each do |t|
29
+ case t
30
+ in Class
31
+ t.class_eval(&block)
32
+ else
33
+ t.class.class_eval(&block)
34
+ end
35
+ end
25
36
  end
26
37
  end
@@ -3,8 +3,8 @@
3
3
  require_relative './struct'
4
4
 
5
5
  module Rstructural::Enum
6
- def self.extended(mod)
7
- @@enum_values ||= []
6
+ def self.extended(klass)
7
+ klass.class_variable_set(:@@enum_values, [])
8
8
  end
9
9
 
10
10
  def enum(value, &block)
@@ -12,7 +12,7 @@ module Rstructural::Enum
12
12
  raise ArgumentError, "Enum '#{value}' already defined in #{type.name}"
13
13
  end
14
14
  Rstructural::Struct.new(:value, __caller: caller, &block).new(value).tap do |k|
15
- @@enum_values << k
15
+ self.class_variable_get(:@@enum_values) << k
16
16
  def k.name
17
17
  self.class.name
18
18
  end
@@ -20,7 +20,13 @@ module Rstructural::Enum
20
20
  end
21
21
 
22
22
  def of(value)
23
- @@enum_values.find { |v| v.value == value }
23
+ self.class_variable_get(:@@enum_values).find { |v| v.value == value }
24
+ end
25
+
26
+ def interface(&block)
27
+ self.class_variable_get(:@@enum_values).each do |t|
28
+ t.class.class_eval(&block)
29
+ end
24
30
  end
25
31
  end
26
32
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "rstructural"
3
- spec.version = "0.1.2"
3
+ spec.version = "0.2.0"
4
4
  spec.authors = ["petitviolet"]
5
5
  spec.email = ["violethero0820@gmail.com"]
6
6
 
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.description = %q{Structural types, Struct, Enum and ADT for Ruby implemented with Ruby}
9
9
  spec.homepage = "https://github.com/petitviolet/rstructural"
10
10
  spec.license = "MIT"
11
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
11
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0") # using pattern match
12
12
 
13
13
  spec.metadata["homepage_uri"] = spec.homepage
14
14
  spec.metadata["source_code_uri"] = spec.homepage
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rstructural
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - petitviolet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2020-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -61,7 +61,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 2.3.0
64
+ version: 2.7.0
65
65
  required_rubygems_version: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="