rfunk 1.7.0 → 2.1.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 +5 -5
- data/lib/rfunk.rb +1 -0
- data/lib/rfunk/attribute/attribute_definition.rb +2 -8
- data/lib/rfunk/attribute/error_checking.rb +2 -0
- data/lib/rfunk/attribute/function.rb +4 -4
- data/lib/rfunk/attribute/immutable.rb +1 -1
- data/lib/rfunk/either/either.rb +1 -1
- data/lib/rfunk/match.rb +4 -4
- data/lib/rfunk/match/error.rb +6 -0
- data/lib/rfunk/maybe/none.rb +20 -4
- data/lib/rfunk/maybe/option.rb +11 -19
- data/lib/rfunk/maybe/some.rb +14 -8
- data/lib/rfunk/version.rb +1 -1
- metadata +49 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dc3829e8c2bfd946b7cb83442b4dc14576c7491c559e7cd813b35a02ea0f7624
|
4
|
+
data.tar.gz: c30bcb3d0f9c431195fbde08a6d2d505f8328d4ccb129bd4b1b5535b57aad0d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f1dd8062fef1b43d246d413a47d653b244e880132d937b4b47e6aab5b5e28c715384d0b6a0a969d5610aebdb51a3e5a3f8ddc70dd35df0e41a7f2fa9d32cad9
|
7
|
+
data.tar.gz: a9024ba13ff865215a690f0454df329155219e5e0c7cad44b3546de44778625b67eaedff809d8bb36ce934702dcfcc6777353a49eee38b3885eea2ab41d81b45
|
data/lib/rfunk.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
module RFunk
|
2
2
|
module AttributeDefinition
|
3
3
|
def attribute(name, type, options = {})
|
4
|
-
RFunk::AttributeVariable.new.add(instance: self,
|
5
|
-
name: name,
|
6
|
-
type: type,
|
7
|
-
options: options)
|
8
|
-
|
4
|
+
RFunk::AttributeVariable.new.add(instance: self, name: name, type: type, options: options)
|
9
5
|
create_method(name, type)
|
10
6
|
end
|
11
7
|
|
@@ -15,9 +11,7 @@ module RFunk
|
|
15
11
|
define_method(name) do |value = nil|
|
16
12
|
if value
|
17
13
|
RFunk::ErrorChecking.new.raise_expected_attribute_type(name, value, type)
|
18
|
-
RFunk::Immutable.new.create(instance: self,
|
19
|
-
variable_name: variable_name(name),
|
20
|
-
value: value)
|
14
|
+
RFunk::Immutable.new.create(instance: self, variable_name: variable_name(name), value: value)
|
21
15
|
else
|
22
16
|
RFunk.option(instance_variable_get(variable_name(name)))
|
23
17
|
end
|
@@ -18,6 +18,7 @@ module RFunk
|
|
18
18
|
|
19
19
|
def raise_not_found(key, attributes)
|
20
20
|
return if attributes.key?(key)
|
21
|
+
|
21
22
|
message = "Attribute with name '#{key}' does not exist. The only available attributes are '#{attributes.keys}'"
|
22
23
|
raise RFunk::NotFoundError, message
|
23
24
|
end
|
@@ -54,6 +55,7 @@ module RFunk
|
|
54
55
|
|
55
56
|
def raise_type(name, value, type, message)
|
56
57
|
return if value.is_a?(type)
|
58
|
+
|
57
59
|
raise TypeError, "Expected a type of '#{type}' for #{message} '#{name}'"
|
58
60
|
end
|
59
61
|
end
|
@@ -26,6 +26,7 @@ module RFunk
|
|
26
26
|
|
27
27
|
def assert(&_)
|
28
28
|
return true if yield
|
29
|
+
|
29
30
|
raise RFunk::AssertionError
|
30
31
|
end
|
31
32
|
|
@@ -73,17 +74,16 @@ module RFunk
|
|
73
74
|
|
74
75
|
def execute_block(block, error)
|
75
76
|
return unless block
|
77
|
+
|
76
78
|
instance_eval(&block).tap { |r| error_checking.raise_condition_error(error, r) }
|
77
79
|
end
|
78
80
|
|
79
81
|
def error_checking
|
80
|
-
|
82
|
+
@error_checking ||= RFunk::ErrorChecking.new
|
81
83
|
end
|
82
84
|
|
83
85
|
def validate_return_type(return_value)
|
84
|
-
error_checking.raise_expected_return_type(function_name.value,
|
85
|
-
return_value,
|
86
|
-
type_annotation.return)
|
86
|
+
error_checking.raise_expected_return_type(function_name.value, return_value, type_annotation.return)
|
87
87
|
end
|
88
88
|
|
89
89
|
def validate_parameter_types(*args)
|
@@ -20,7 +20,7 @@ module RFunk
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def create_instance_variables(instance, object, variable_name)
|
23
|
-
instance.instance_variables.
|
23
|
+
instance.instance_variables.reject { |v| v == variable_name }.each do |v|
|
24
24
|
previous_value = instance.instance_variable_get(v)
|
25
25
|
object.instance_variable_set(v, previous_value)
|
26
26
|
end
|
data/lib/rfunk/either/either.rb
CHANGED
data/lib/rfunk/match.rb
CHANGED
@@ -4,11 +4,11 @@ module RFunk
|
|
4
4
|
pattern = RFunk::Match::Pattern.new
|
5
5
|
yield(pattern)
|
6
6
|
|
7
|
-
pattern.cases.
|
8
|
-
return t.last.call(option.identity) if t.first == option.key
|
9
|
-
end
|
7
|
+
pattern_case = pattern.cases.find { |t| t.first == option.key || t.first == :_ }
|
10
8
|
|
11
|
-
|
9
|
+
return pattern_case.last.call(option.identity) if pattern_case
|
10
|
+
|
11
|
+
raise RFunk::Match::Error, "Could not match for option '#{option.key}'."
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/rfunk/maybe/none.rb
CHANGED
@@ -2,8 +2,24 @@ module RFunk
|
|
2
2
|
class None < RFunk::Option
|
3
3
|
include Singleton
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
class << self
|
6
|
+
def create(_)
|
7
|
+
instance
|
8
|
+
end
|
9
|
+
|
10
|
+
def satisfies?(value)
|
11
|
+
value.nil? || empty?(value)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def empty?(value)
|
17
|
+
value.respond_to?(:empty?) && value.empty?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def value
|
22
|
+
RFunk::None.instance
|
7
23
|
end
|
8
24
|
|
9
25
|
def or(other)
|
@@ -46,8 +62,8 @@ module RFunk
|
|
46
62
|
end
|
47
63
|
|
48
64
|
class << self
|
49
|
-
def none
|
50
|
-
RFunk.
|
65
|
+
def none
|
66
|
+
RFunk::None.instance
|
51
67
|
end
|
52
68
|
end
|
53
69
|
end
|
data/lib/rfunk/maybe/option.rb
CHANGED
@@ -1,33 +1,25 @@
|
|
1
1
|
module RFunk
|
2
2
|
class Option
|
3
3
|
include Enumerable
|
4
|
+
extend Forwardable
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
class << self
|
7
|
+
def inherited(subclass)
|
8
|
+
@descendants ||= []
|
9
|
+
@descendants << subclass
|
10
|
+
end
|
7
11
|
|
8
|
-
|
12
|
+
attr_reader :descendants
|
9
13
|
end
|
14
|
+
|
15
|
+
def_delegators :enum, :each
|
10
16
|
end
|
11
17
|
|
12
18
|
class << self
|
13
19
|
def option(value)
|
14
|
-
if
|
15
|
-
value
|
16
|
-
elsif nothing?(value)
|
17
|
-
RFunk::None.instance
|
18
|
-
else
|
19
|
-
RFunk::Some.new(value)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def nothing?(value)
|
26
|
-
value.nil? || empty?(value) || value == RFunk::None.instance
|
27
|
-
end
|
20
|
+
return value if RFunk::Option.descendants.map { |t| value.is_a?(t) }.any?
|
28
21
|
|
29
|
-
|
30
|
-
value.respond_to?(:empty?) && value.empty?
|
22
|
+
RFunk::Option.descendants.find { |c| c.satisfies?(value) }.create(value)
|
31
23
|
end
|
32
24
|
end
|
33
25
|
end
|
data/lib/rfunk/maybe/some.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
module RFunk
|
2
2
|
class Some < Option
|
3
|
-
|
3
|
+
class << self
|
4
|
+
def create(value)
|
5
|
+
new(value)
|
6
|
+
end
|
7
|
+
|
8
|
+
def satisfies?(value)
|
9
|
+
!value.nil?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :value
|
4
14
|
|
5
15
|
def initialize(value)
|
6
16
|
@value = value
|
7
17
|
end
|
8
18
|
|
9
|
-
def value(_ = RFunk.none)
|
10
|
-
@value
|
11
|
-
end
|
12
|
-
|
13
19
|
alias identity value
|
14
20
|
|
15
21
|
def or(_)
|
@@ -18,6 +24,7 @@ module RFunk
|
|
18
24
|
|
19
25
|
def pipe(&block)
|
20
26
|
return self if block.nil?
|
27
|
+
|
21
28
|
RFunk.option(yield value)
|
22
29
|
end
|
23
30
|
|
@@ -26,8 +33,7 @@ module RFunk
|
|
26
33
|
end
|
27
34
|
|
28
35
|
def ==(other)
|
29
|
-
|
30
|
-
value == RFunk.option(other).value
|
36
|
+
value == other.value
|
31
37
|
end
|
32
38
|
|
33
39
|
def <=>(other)
|
@@ -38,7 +44,7 @@ module RFunk
|
|
38
44
|
[other, value]
|
39
45
|
end
|
40
46
|
|
41
|
-
[
|
47
|
+
%i[to_str to_ary to_hash].each { |k| define_method(k) { value } }
|
42
48
|
|
43
49
|
def key
|
44
50
|
:some
|
data/lib/rfunk/version.rb
CHANGED
metadata
CHANGED
@@ -1,73 +1,79 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Falkowski
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: concurrent-ruby
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '1.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.1.7
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: '1.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.1.7
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
34
|
+
name: hamster
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
39
|
+
version: '3.0'
|
34
40
|
type: :runtime
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
46
|
+
version: '3.0'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
48
|
+
name: ice_nine
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
53
|
+
version: 0.11.2
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
60
|
+
version: 0.11.2
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
62
|
+
name: rake
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
|
-
- - "
|
65
|
+
- - ">="
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
62
|
-
type: :
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
|
-
- - "
|
72
|
+
- - ">="
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
74
|
+
version: '0'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
76
|
+
name: rspec
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
79
|
- - ">="
|
@@ -81,7 +87,7 @@ dependencies:
|
|
81
87
|
- !ruby/object:Gem::Version
|
82
88
|
version: '0'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
|
-
name: rspec
|
90
|
+
name: rspec-given
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
93
|
- - ">="
|
@@ -95,7 +101,7 @@ dependencies:
|
|
95
101
|
- !ruby/object:Gem::Version
|
96
102
|
version: '0'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
104
|
+
name: rspec_junit_formatter
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
107
|
- - ">="
|
@@ -122,6 +128,20 @@ dependencies:
|
|
122
128
|
- - ">="
|
123
129
|
- !ruby/object:Gem::Version
|
124
130
|
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: simplecov
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
125
145
|
description: See https://github.com/alexfalkowski/rfunk/blob/master/README.md
|
126
146
|
email:
|
127
147
|
- alexrfalkowski@gmail.com
|
@@ -149,6 +169,7 @@ files:
|
|
149
169
|
- lib/rfunk/either/success.rb
|
150
170
|
- lib/rfunk/lazy.rb
|
151
171
|
- lib/rfunk/match.rb
|
172
|
+
- lib/rfunk/match/error.rb
|
152
173
|
- lib/rfunk/match/pattern.rb
|
153
174
|
- lib/rfunk/maybe/none.rb
|
154
175
|
- lib/rfunk/maybe/option.rb
|
@@ -159,7 +180,7 @@ homepage: https://github.com/alexfalkowski/rfunk
|
|
159
180
|
licenses:
|
160
181
|
- MIT
|
161
182
|
metadata: {}
|
162
|
-
post_install_message:
|
183
|
+
post_install_message:
|
163
184
|
rdoc_options: []
|
164
185
|
require_paths:
|
165
186
|
- lib
|
@@ -167,16 +188,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
188
|
requirements:
|
168
189
|
- - ">="
|
169
190
|
- !ruby/object:Gem::Version
|
170
|
-
version:
|
191
|
+
version: 2.7.0
|
192
|
+
- - "<"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 2.8.0
|
171
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
196
|
requirements:
|
173
197
|
- - ">="
|
174
198
|
- !ruby/object:Gem::Version
|
175
199
|
version: '0'
|
176
200
|
requirements: []
|
177
|
-
|
178
|
-
|
179
|
-
signing_key:
|
201
|
+
rubygems_version: 3.1.4
|
202
|
+
signing_key:
|
180
203
|
specification_version: 4
|
181
204
|
summary: Functional Programming in Ruby
|
182
205
|
test_files: []
|