rfunk 0.9.0 → 0.10.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 +4 -4
- data/lib/rfunk/attribute/attribute.rb +1 -1
- data/lib/rfunk/attribute/attribute_definition.rb +1 -1
- data/lib/rfunk/attribute/attribute_function.rb +6 -8
- data/lib/rfunk/attribute/error_checking.rb +5 -1
- data/lib/rfunk/attribute/function.rb +28 -11
- data/lib/rfunk/attribute/type_annotation.rb +25 -0
- data/lib/rfunk/version.rb +1 -1
- data/lib/rfunk.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62eadf99b770f0a7b858ec63d74bbf43a2e0fcd9
|
4
|
+
data.tar.gz: 43c0275f0e81ab6802c9f7acf4b37d6c05254800
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c8b2e6b5c23fee2d9359aa0a60e38ed798cab3992eb5708a569d90b8fc788c1a689ec490c5228bf835367b139ce60d67589d0927b1a03ae91d96b6a19f550f9
|
7
|
+
data.tar.gz: b7b1866df97a5e3ba8b241dc1822460516a507ae007f139e8d31a759f93a1f91eeacb35fb443432a189037f183bef6d664042e7fe4d66ff839d2e9d76954c296
|
@@ -31,7 +31,7 @@ module RFunk
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_variable(attribute, key, value)
|
34
|
-
ErrorChecking.new.
|
34
|
+
ErrorChecking.new.raise_expected_attribute_type(key, value, attribute.type)
|
35
35
|
self.instance_variable_set(variable_name(key), value)
|
36
36
|
end
|
37
37
|
|
@@ -8,7 +8,7 @@ module RFunk
|
|
8
8
|
|
9
9
|
define_method(name) { |value = nil|
|
10
10
|
if value
|
11
|
-
ErrorChecking.new.
|
11
|
+
ErrorChecking.new.raise_expected_attribute_type(name, value, type)
|
12
12
|
Immutable.new.create(instance: self,
|
13
13
|
variable_name: variable_name(name),
|
14
14
|
value: value)
|
@@ -1,23 +1,21 @@
|
|
1
1
|
module RFunk
|
2
2
|
module AttributeFunction
|
3
3
|
def fun(definition, &block)
|
4
|
-
|
4
|
+
function_definition = function_definition(definition)
|
5
|
+
lambda = -> (*args) { Function.new(self, function_definition, &block).execute(*args) }
|
5
6
|
|
6
|
-
|
7
|
-
Function.new(self, method_definition, &block).execute(*args)
|
8
|
-
}
|
9
|
-
|
10
|
-
define_method method_definition.value(0).value, &lambda
|
7
|
+
define_method function_definition.value(0).value, &lambda
|
11
8
|
end
|
12
9
|
|
13
10
|
[:fn, :func, :defn].each { |m| alias_method m, :fun }
|
14
11
|
|
15
12
|
private
|
16
13
|
|
17
|
-
def
|
14
|
+
def function_definition(definition)
|
18
15
|
case definition
|
19
16
|
when Hash
|
20
|
-
|
17
|
+
return_type = TypeAnnotation.new(definition.values.first.to_s)
|
18
|
+
Tuple(definition.keys.first, return_type)
|
21
19
|
else
|
22
20
|
Tuple(definition, None())
|
23
21
|
end
|
@@ -8,10 +8,14 @@ module RFunk
|
|
8
8
|
raise_return_type_with_message name, value, type, 'return'
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def raise_expected_attribute_type(name, value, type)
|
12
12
|
raise_return_type_with_message name, value, type, 'attribute'
|
13
13
|
end
|
14
14
|
|
15
|
+
def raise_expected_parameter_type(name, value, type)
|
16
|
+
raise_return_type_with_message name, value, type, 'parameter'
|
17
|
+
end
|
18
|
+
|
15
19
|
def raise_not_found(key, attributes)
|
16
20
|
unless attributes.key?(key)
|
17
21
|
message = "Attribute with name '#{key}' does not exist. The only available attributes are '#{attributes.keys}'"
|
@@ -2,9 +2,9 @@ module RFunk
|
|
2
2
|
class Function
|
3
3
|
attr_reader :this
|
4
4
|
|
5
|
-
def initialize(this,
|
5
|
+
def initialize(this, function_definition, &block)
|
6
6
|
@this = this
|
7
|
-
@
|
7
|
+
@function_definition = function_definition
|
8
8
|
@block = block
|
9
9
|
@variables = {}
|
10
10
|
end
|
@@ -43,7 +43,8 @@ module RFunk
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def execute(*args)
|
46
|
-
|
46
|
+
validate_parameter_types *args
|
47
|
+
return_value = instance_exec(*args, &block)
|
47
48
|
|
48
49
|
if body_block
|
49
50
|
if pre_block
|
@@ -62,8 +63,8 @@ module RFunk
|
|
62
63
|
validate_return_type(body)
|
63
64
|
}
|
64
65
|
else
|
65
|
-
validate_return_type(
|
66
|
-
Option(
|
66
|
+
validate_return_type(return_value)
|
67
|
+
Option(return_value)
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
@@ -73,17 +74,33 @@ module RFunk
|
|
73
74
|
|
74
75
|
private
|
75
76
|
|
76
|
-
attr_reader :block, :pre_block, :post_block, :body_block, :
|
77
|
+
attr_reader :block, :pre_block, :post_block, :body_block, :function_definition
|
77
78
|
attr_accessor :variables
|
78
79
|
|
79
80
|
def error_checking
|
80
|
-
|
81
|
+
Lazy(-> { ErrorChecking.new }).value
|
81
82
|
end
|
82
83
|
|
83
|
-
def validate_return_type(
|
84
|
-
error_checking.raise_expected_return_type
|
85
|
-
|
86
|
-
|
84
|
+
def validate_return_type(return_value)
|
85
|
+
error_checking.raise_expected_return_type(function_name.value,
|
86
|
+
return_value,
|
87
|
+
type_annotation.return)
|
88
|
+
end
|
89
|
+
|
90
|
+
def validate_parameter_types(*args)
|
91
|
+
values = args.zip(type_annotation.parameters)
|
92
|
+
values.each_with_index { |v, i|
|
93
|
+
tuple = Tuple(*v)
|
94
|
+
error_checking.raise_expected_parameter_type(i + 1, tuple.value(0), tuple.value(1))
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def function_name
|
99
|
+
function_definition.value(0)
|
100
|
+
end
|
101
|
+
|
102
|
+
def type_annotation
|
103
|
+
function_definition.value(1)
|
87
104
|
end
|
88
105
|
end
|
89
106
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RFunk
|
2
|
+
class TypeAnnotation
|
3
|
+
attr_reader :parameters, :return
|
4
|
+
|
5
|
+
def initialize(annotation)
|
6
|
+
case Option(annotation)
|
7
|
+
when Some
|
8
|
+
@annotation = annotation.split('->')
|
9
|
+
@parameters = if @annotation.count == 2
|
10
|
+
@annotation[0].split(',').map { |p| Object.const_get(p.strip) }
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
@return = if @annotation.count == 2
|
15
|
+
Object.const_get(@annotation[1].strip)
|
16
|
+
else
|
17
|
+
Object.const_get(@annotation[0].strip)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
@parameters = []
|
21
|
+
@return = None()
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rfunk/version.rb
CHANGED
data/lib/rfunk.rb
CHANGED
@@ -17,6 +17,7 @@ require 'rfunk/attribute/function'
|
|
17
17
|
require 'rfunk/attribute/attribute_definition'
|
18
18
|
require 'rfunk/attribute/attribute_function'
|
19
19
|
require 'rfunk/attribute/attribute'
|
20
|
+
require 'rfunk/attribute/type_annotation'
|
20
21
|
require 'rfunk/maybe/option'
|
21
22
|
require 'rfunk/maybe/none'
|
22
23
|
require 'rfunk/maybe/some'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Falkowski
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/rfunk/attribute/not_found_error.rb
|
116
116
|
- lib/rfunk/attribute/post_condition_error.rb
|
117
117
|
- lib/rfunk/attribute/pre_condition_error.rb
|
118
|
+
- lib/rfunk/attribute/type_annotation.rb
|
118
119
|
- lib/rfunk/either/either.rb
|
119
120
|
- lib/rfunk/either/failure.rb
|
120
121
|
- lib/rfunk/either/success.rb
|