nrser 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
- data/lib/nrser/char.rb +0 -6
- data/lib/nrser/core_ext/array.rb +120 -0
- data/lib/nrser/core_ext/binding.rb +44 -0
- data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
- data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
- data/lib/nrser/core_ext/exception.rb +30 -0
- data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
- data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
- data/lib/nrser/core_ext/hash.rb +50 -0
- data/lib/nrser/core_ext/module/method_objects.rb +96 -0
- data/lib/nrser/core_ext/module/names.rb +69 -0
- data/lib/nrser/core_ext/module/source_locations.rb +214 -0
- data/lib/nrser/core_ext/module.rb +2 -0
- data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
- data/lib/nrser/core_ext/object.rb +46 -0
- data/lib/nrser/core_ext/open_struct.rb +6 -0
- data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
- data/lib/nrser/{ext → core_ext}/string.rb +6 -12
- data/lib/nrser/core_ext/symbol.rb +13 -0
- data/lib/nrser/core_ext/time.rb +46 -0
- data/lib/nrser/core_ext.rb +13 -0
- data/lib/nrser/errors/abstract_method_error.rb +150 -0
- data/lib/nrser/errors/argument_error.rb +42 -0
- data/lib/nrser/errors/nicer_error.rb +298 -72
- data/lib/nrser/errors/type_error.rb +46 -0
- data/lib/nrser/errors.rb +4 -53
- data/lib/nrser/ext/tree.rb +3 -0
- data/lib/nrser/functions/enumerable/associate.rb +6 -9
- data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
- data/lib/nrser/functions/enumerable.rb +1 -3
- data/lib/nrser/functions/exception.rb +1 -1
- data/lib/nrser/functions/hash.rb +0 -6
- data/lib/nrser/functions/merge_by.rb +2 -2
- data/lib/nrser/functions/module/method_objects.rb +77 -0
- data/lib/nrser/functions/module.rb +1 -2
- data/lib/nrser/functions/open_struct.rb +25 -35
- data/lib/nrser/functions/proc.rb +1 -6
- data/lib/nrser/functions/string/looks_like.rb +32 -1
- data/lib/nrser/functions/string.rb +1 -40
- data/lib/nrser/functions/text/lines.rb +2 -1
- data/lib/nrser/functions.rb +0 -1
- data/lib/nrser/graph/tsorter.rb +41 -0
- data/lib/nrser/labs/core_ext/binding.rb +37 -0
- data/lib/nrser/labs/stash.rb +372 -0
- data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
- data/lib/nrser/log/appender.rb +3 -0
- data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
- data/lib/nrser/log/formatters/mixin.rb +270 -0
- data/lib/nrser/{logging → log}/formatters.rb +0 -0
- data/lib/nrser/log/logger.rb +229 -0
- data/lib/nrser/log/mixin.rb +56 -0
- data/lib/nrser/log.rb +723 -0
- data/lib/nrser/message.rb +24 -3
- data/lib/nrser/meta/source/location.rb +158 -0
- data/lib/nrser/meta.rb +1 -1
- data/lib/nrser/props/class_methods.rb +118 -0
- data/lib/nrser/props/immutable/hash.rb +111 -0
- data/lib/nrser/props/immutable/hash_variable.rb +82 -0
- data/lib/nrser/props/immutable/instance_variables.rb +48 -0
- data/lib/nrser/props/immutable/vector.rb +107 -0
- data/lib/nrser/props/instance_methods.rb +184 -0
- data/lib/nrser/props/metadata.rb +359 -0
- data/lib/nrser/props/mutable/instance_variables.rb +60 -0
- data/lib/nrser/props/mutable/stash.rb +199 -0
- data/lib/nrser/{meta/props → props}/prop.rb +217 -112
- data/lib/nrser/props/storage/instance_variable.rb +85 -0
- data/lib/nrser/props/storage/instance_variables.rb +67 -0
- data/lib/nrser/props/storage/key.rb +88 -0
- data/lib/nrser/props.rb +9 -0
- data/lib/nrser/refinements/sugar.rb +41 -0
- data/lib/nrser/refinements/types.rb +2 -2
- data/lib/nrser/refinements.rb +14 -16
- data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
- data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
- data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
- data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
- data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
- data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
- data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
- data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
- data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
- data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
- data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
- data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
- data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
- data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
- data/lib/nrser/rspex/example_group/overrides.rb +66 -0
- data/lib/nrser/rspex/example_group.rb +20 -252
- data/lib/nrser/rspex/format.rb +83 -17
- data/lib/nrser/rspex.rb +4 -34
- data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
- data/lib/nrser/{env → sys/env}/path.rb +1 -2
- data/lib/nrser/{env.rb → sys/env.rb} +2 -1
- data/lib/nrser/sys.rb +5 -0
- data/lib/nrser/types/any.rb +36 -7
- data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
- data/lib/nrser/types/attrs.rb +68 -15
- data/lib/nrser/types/booleans.rb +95 -34
- data/lib/nrser/types/bounded.rb +12 -10
- data/lib/nrser/types/combinators.rb +74 -37
- data/lib/nrser/types/errors/check_error.rb +86 -0
- data/lib/nrser/types/errors/from_string_error.rb +82 -0
- data/lib/nrser/types/factory.rb +91 -0
- data/lib/nrser/types/hashes.rb +171 -26
- data/lib/nrser/types/in.rb +25 -12
- data/lib/nrser/types/is.rb +50 -18
- data/lib/nrser/types/is_a.rb +52 -33
- data/lib/nrser/types/labels.rb +6 -33
- data/lib/nrser/types/maybe.rb +12 -4
- data/lib/nrser/types/nil.rb +24 -4
- data/lib/nrser/types/not.rb +6 -16
- data/lib/nrser/types/numbers.rb +94 -57
- data/lib/nrser/types/pairs.rb +57 -57
- data/lib/nrser/types/paths.rb +112 -133
- data/lib/nrser/types/responds.rb +64 -74
- data/lib/nrser/types/shape.rb +29 -24
- data/lib/nrser/types/strings.rb +25 -17
- data/lib/nrser/types/symbols.rb +19 -17
- data/lib/nrser/types/trees.rb +18 -70
- data/lib/nrser/types/tuples.rb +36 -40
- data/lib/nrser/types/type.rb +342 -91
- data/lib/nrser/types/when.rb +40 -18
- data/lib/nrser/types/where.rb +94 -9
- data/lib/nrser/types.rb +72 -63
- data/lib/nrser/version.rb +1 -1
- data/lib/nrser.rb +18 -18
- data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
- data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
- data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
- data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
- data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
- data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
- data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
- data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
- data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
- data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
- data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
- data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
- data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
- data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
- data/spec/lib/nrser/refinements/array_spec.rb +2 -15
- data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
- data/spec/lib/nrser/refinements/set_spec.rb +2 -15
- data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
- data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
- data/spec/lib/nrser/types/array_spec.rb +8 -8
- data/spec/lib/nrser/types/paths_spec.rb +15 -18
- data/spec/spec_helper.rb +4 -0
- metadata +109 -69
- data/lib/nrser/ext/binding.rb +0 -36
- data/lib/nrser/ext/module.rb +0 -62
- data/lib/nrser/ext.rb +0 -8
- data/lib/nrser/functions/binding.rb +0 -76
- data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
- data/lib/nrser/functions/enumerable/map_values.rb +0 -94
- data/lib/nrser/functions/hash/deep_merge.rb +0 -57
- data/lib/nrser/functions/hash/except_keys.rb +0 -44
- data/lib/nrser/functions/hash/slice_keys.rb +0 -43
- data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
- data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
- data/lib/nrser/functions/hash/transform_keys.rb +0 -140
- data/lib/nrser/functions/module/methods.rb +0 -206
- data/lib/nrser/functions/module/source_locations.rb +0 -213
- data/lib/nrser/logging/appender.rb +0 -3
- data/lib/nrser/logging.rb +0 -353
- data/lib/nrser/meta/props/base.rb +0 -31
- data/lib/nrser/meta/props.rb +0 -357
- data/lib/nrser/refinements/array.rb +0 -133
- data/lib/nrser/refinements/binding.rb +0 -6
- data/lib/nrser/refinements/enumerator.rb +0 -5
- data/lib/nrser/refinements/exception.rb +0 -35
- data/lib/nrser/refinements/hash.rb +0 -150
- data/lib/nrser/refinements/module.rb +0 -5
- data/lib/nrser/refinements/object.rb +0 -42
- data/lib/nrser/refinements/open_struct.rb +0 -28
- data/lib/nrser/refinements/pathname.rb +0 -5
- data/lib/nrser/refinements/set.rb +0 -5
- data/lib/nrser/refinements/string.rb +0 -5
- data/lib/nrser/refinements/symbol.rb +0 -20
- data/lib/nrser/rspex/described.rb +0 -99
- data/spec/design/mapping_spec.rb +0 -42
- data/spec/lib/nrser/functions/hash_spec.rb +0 -41
- data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
- data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
data/lib/nrser/types/is_a.rb
CHANGED
@@ -3,73 +3,92 @@ require 'nrser/types/type'
|
|
3
3
|
using NRSER
|
4
4
|
|
5
5
|
module NRSER::Types
|
6
|
+
# Type satisfied by class membership (or mixin presence for modules).
|
7
|
+
#
|
8
|
+
# Tests via the subject value's `#is_a?` method.
|
9
|
+
#
|
6
10
|
class IsA < NRSER::Types::Type
|
7
|
-
attr_reader :
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
unless
|
11
|
-
raise ArgumentError
|
12
|
-
`
|
13
|
-
|
14
|
-
<%= klass.pretty_inspect %>
|
15
|
-
|
16
|
-
ERB
|
11
|
+
attr_reader :mod
|
12
|
+
|
13
|
+
def initialize mod, init_from_data: false, **options
|
14
|
+
unless mod.is_a?( Module )
|
15
|
+
raise ArgumentError,
|
16
|
+
"`mod` argument must be a Module (inc. Class), " \
|
17
|
+
"received #{ mod.inspect }"
|
17
18
|
end
|
18
19
|
|
19
20
|
super **options
|
20
|
-
|
21
|
+
|
22
|
+
@init_from_data = !!init_from_data
|
23
|
+
|
24
|
+
@mod = mod
|
21
25
|
end
|
22
26
|
|
23
27
|
|
24
|
-
def
|
25
|
-
|
28
|
+
def explain
|
29
|
+
mod.safe_name
|
26
30
|
end
|
27
31
|
|
28
32
|
|
29
|
-
def test value
|
30
|
-
value.is_a?
|
33
|
+
def test? value
|
34
|
+
value.is_a? mod
|
31
35
|
end
|
32
36
|
|
33
37
|
|
34
|
-
|
38
|
+
|
39
|
+
# @todo Document init_from_data? method.
|
40
|
+
#
|
41
|
+
# @param [type] arg_name
|
42
|
+
# @todo Add name param description.
|
35
43
|
#
|
36
|
-
#
|
44
|
+
# @return [return_type]
|
45
|
+
# @todo Document return value.
|
37
46
|
#
|
38
|
-
|
39
|
-
|
47
|
+
def init_from_data?
|
48
|
+
@init_from_data
|
49
|
+
end # #init_from_data?
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
# Forwards to `mod.from_data`.
|
40
54
|
#
|
41
|
-
# @
|
42
|
-
#
|
55
|
+
# @param data (see NRSER::Types::Type#from_data)
|
56
|
+
# @return (see NRSER::Types::Type#from_data)
|
57
|
+
# @raise (see NRSER::Types::Type#from_data)
|
43
58
|
#
|
44
|
-
def
|
45
|
-
if
|
46
|
-
|
47
|
-
check @klass.from_data( data )
|
48
|
-
else
|
49
|
-
super data
|
50
|
-
end
|
59
|
+
def custom_from_data data
|
60
|
+
if init_from_data?
|
61
|
+
mod.new data
|
51
62
|
else
|
52
|
-
|
63
|
+
mod.from_data data
|
53
64
|
end
|
54
65
|
end
|
55
66
|
|
56
67
|
|
68
|
+
# Overrides {NRSER::Types::Type#has_from_data?} to respond `true` when
|
69
|
+
# there is a instance-specific `@from_data` or the {#mod} responds to
|
70
|
+
# `.from_data`.
|
71
|
+
#
|
72
|
+
# @return [Boolean]
|
73
|
+
#
|
57
74
|
def has_from_data?
|
58
|
-
@from_data ||
|
75
|
+
@from_data ||
|
76
|
+
init_from_data? ||
|
77
|
+
mod.respond_to?( :from_data )
|
59
78
|
end
|
60
79
|
|
61
80
|
|
62
81
|
def == other
|
63
82
|
equal?( other ) ||
|
64
83
|
( self.class == other.class &&
|
65
|
-
self.
|
84
|
+
self.mod == other.mod )
|
66
85
|
end
|
67
86
|
|
68
87
|
end # IsA
|
69
88
|
|
70
89
|
|
71
90
|
# class membership
|
72
|
-
|
73
|
-
IsA.new
|
91
|
+
def_factory :is_a do |mod, **options|
|
92
|
+
IsA.new mod, **options
|
74
93
|
end
|
75
94
|
end # NRSER::Types
|
data/lib/nrser/types/labels.rb
CHANGED
@@ -1,28 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Stdlib
|
5
|
-
# -----------------------------------------------------------------------
|
6
|
-
|
7
|
-
# Deps
|
8
|
-
# -----------------------------------------------------------------------
|
9
|
-
|
10
|
-
# Project / Package
|
11
|
-
# -----------------------------------------------------------------------
|
12
|
-
|
13
|
-
|
14
|
-
# Refinements
|
15
|
-
# =======================================================================
|
16
|
-
|
17
|
-
require 'nrser/refinements'
|
18
|
-
using NRSER
|
19
|
-
|
20
|
-
|
21
|
-
# Declarations
|
22
|
-
# =======================================================================
|
23
|
-
|
24
|
-
module NRSER; end
|
25
|
-
|
1
|
+
require_relative './combinators'
|
2
|
+
require_relative './strings'
|
26
3
|
|
27
4
|
# Definitions
|
28
5
|
# =======================================================================
|
@@ -36,14 +13,10 @@ module NRSER::Types
|
|
36
13
|
#
|
37
14
|
# @return [NRSER::Types::Type]
|
38
15
|
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
union non_empty_str, non_empty_sym, **options
|
44
|
-
end
|
16
|
+
def_factory(
|
17
|
+
:label,
|
18
|
+
) do |name: 'Label', **options|
|
19
|
+
union non_empty_str, non_empty_sym, name: name, **options
|
45
20
|
end # .label
|
46
21
|
|
47
|
-
LABEL = label( name: 'LabelType' ).freeze
|
48
|
-
|
49
22
|
end # module NRSER::Types
|
data/lib/nrser/types/maybe.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
|
-
|
1
|
+
require_relative './combinators'
|
2
|
+
require_relative './nil'
|
2
3
|
|
3
4
|
module NRSER::Types
|
4
5
|
|
5
|
-
# nil or the
|
6
|
-
|
7
|
-
|
6
|
+
# Type satisfied by `nil` or the parametrized type.
|
7
|
+
#
|
8
|
+
def_factory(
|
9
|
+
:maybe,
|
10
|
+
) do |type, **options|
|
11
|
+
union \
|
12
|
+
self.nil,
|
13
|
+
type,
|
14
|
+
name: (options[:name] || "#{ type.name }?"),
|
15
|
+
**options
|
8
16
|
end
|
9
17
|
|
10
18
|
end # NRSER::Types
|
data/lib/nrser/types/nil.rb
CHANGED
@@ -1,8 +1,28 @@
|
|
1
|
-
|
1
|
+
require_relative './is'
|
2
2
|
|
3
3
|
module NRSER::Types
|
4
|
-
#
|
5
|
-
|
6
|
-
|
4
|
+
# Type for `nil`, itself and only.
|
5
|
+
#
|
6
|
+
# @todo
|
7
|
+
# Should we have a `#from_s` that converts the empty string to `nil`?
|
8
|
+
#
|
9
|
+
# Kind-of seems like we would want that to be a different types so that
|
10
|
+
# you can have a Nil type that is distinct from the empty string in
|
11
|
+
# parsing, but also have a type that accepts the empty string and coverts
|
12
|
+
# it to `nil`?
|
13
|
+
#
|
14
|
+
# Something like:
|
15
|
+
#
|
16
|
+
# type = t.empty | t.non_empty_str
|
17
|
+
# type.from_s ''
|
18
|
+
# # => nil
|
19
|
+
# type.from_s 'blah'
|
20
|
+
# # => 'blah'
|
21
|
+
#
|
22
|
+
def_factory(
|
23
|
+
:nil,
|
24
|
+
aliases: [ :null ],
|
25
|
+
) do |name: 'Nil', **options|
|
26
|
+
is nil, name: name, **options
|
7
27
|
end
|
8
28
|
end # NRSER::Types
|
data/lib/nrser/types/not.rb
CHANGED
@@ -22,31 +22,21 @@ module NRSER::Types
|
|
22
22
|
# Instance Methods
|
23
23
|
# ======================================================================
|
24
24
|
|
25
|
-
def test value
|
25
|
+
def test? value
|
26
26
|
! @type.test( value )
|
27
27
|
end
|
28
28
|
|
29
29
|
|
30
|
-
def
|
31
|
-
"
|
30
|
+
def explain
|
31
|
+
"~#{ @type.name }"
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
# @return [String]
|
36
|
-
# a brief string description of the type - just it's {#name} surrounded
|
37
|
-
# by some back-ticks to make it easy to see where it starts and stops.
|
38
|
-
#
|
39
|
-
def to_s
|
40
|
-
"{ x ∉ #{ @type.name } }"
|
41
|
-
end
|
42
|
-
|
43
|
-
alias_method :inspect, :to_s
|
44
|
-
|
45
|
-
|
46
34
|
end # class Not
|
47
35
|
|
48
36
|
|
49
|
-
|
37
|
+
def_factory(
|
38
|
+
:not,
|
39
|
+
) do |type, **options|
|
50
40
|
Not.new type, **options
|
51
41
|
end
|
52
42
|
|
data/lib/nrser/types/numbers.rb
CHANGED
@@ -15,8 +15,8 @@ module NRSER::Types
|
|
15
15
|
# @return [Float]
|
16
16
|
# If the string represents a decimal number.
|
17
17
|
#
|
18
|
-
def self.parse_number
|
19
|
-
float = Float
|
18
|
+
def self.parse_number string
|
19
|
+
float = Float string
|
20
20
|
int = float.to_i
|
21
21
|
if float == int then int else float end
|
22
22
|
end
|
@@ -25,48 +25,44 @@ module NRSER::Types
|
|
25
25
|
# Zero
|
26
26
|
# =====================================================================
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
def_factory(
|
29
|
+
:Zero,
|
30
|
+
aliases: [ :zero ],
|
31
|
+
) do |from_s: method( :parse_number ), **options|
|
32
|
+
is \
|
33
|
+
0,
|
34
|
+
from_s: from_s,
|
35
|
+
**options
|
36
36
|
end
|
37
37
|
|
38
38
|
|
39
39
|
# Number ({Numeric})
|
40
40
|
# =====================================================================
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
def_factory(
|
43
|
+
:Number,
|
44
|
+
aliases: [ :num, :number, :numeric, :Numeric ],
|
45
|
+
) do |name: 'Number', from_s: method( :parse_number ), **options|
|
46
|
+
IsA.new \
|
47
|
+
Numeric,
|
48
|
+
from_s: from_s,
|
49
|
+
**options
|
50
50
|
end
|
51
51
|
|
52
|
-
singleton_class.send :alias_method, :number, :num
|
53
|
-
|
54
52
|
|
55
53
|
# Integers
|
56
54
|
# =====================================================================
|
57
55
|
|
58
|
-
|
59
|
-
Integer,
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
def_factory(
|
57
|
+
:Integer,
|
58
|
+
aliases: [ :int, :integer, :signed ],
|
59
|
+
) do |name: 'ℤ', from_s: method( :parse_number ), **options|
|
60
|
+
IsA.new \
|
61
|
+
Integer,
|
62
|
+
from_s: from_s,
|
63
|
+
**options
|
66
64
|
end
|
67
65
|
|
68
|
-
singleton_class.send :alias_method, :integer, :int
|
69
|
-
|
70
66
|
|
71
67
|
# Bounded Integers
|
72
68
|
# ---------------------------------------------------------------------
|
@@ -77,12 +73,15 @@ module NRSER::Types
|
|
77
73
|
# Integer greater than zero.
|
78
74
|
#
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
def_factory(
|
77
|
+
:PositiveInteger,
|
78
|
+
aliases: [ :pos_int, :positive_int, :positive_integer ]
|
79
|
+
) do |name: 'ℤ⁺', **options|
|
80
|
+
intersection \
|
81
|
+
int,
|
82
|
+
bounded( min: 1 ),
|
83
|
+
name: name,
|
84
|
+
**options
|
86
85
|
end
|
87
86
|
|
88
87
|
# Ugh sometimes the naturals have 0, so omit it...
|
@@ -95,12 +94,15 @@ module NRSER::Types
|
|
95
94
|
# Integer less than zero.
|
96
95
|
#
|
97
96
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
def_factory(
|
98
|
+
:NegativeInteger,
|
99
|
+
aliases: [ :neg_int, :negative_int, :negative_integer ],
|
100
|
+
) do |name: 'ℤ⁻', **options|
|
101
|
+
intersection \
|
102
|
+
int,
|
103
|
+
bounded( max: -1 ),
|
104
|
+
name: name,
|
105
|
+
**options
|
104
106
|
end
|
105
107
|
|
106
108
|
|
@@ -111,20 +113,23 @@ module NRSER::Types
|
|
111
113
|
# as bounded instead of a union.
|
112
114
|
#
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
116
|
+
def_factory(
|
117
|
+
:NonNegativeInteger,
|
118
|
+
aliases: [
|
119
|
+
:non_neg_int,
|
120
|
+
:unsigned,
|
121
|
+
:index,
|
122
|
+
:non_negative_int,
|
123
|
+
:non_negative_integer,
|
124
|
+
],
|
125
|
+
) do |name: 'ℕ⁰', **options|
|
126
|
+
intersection \
|
127
|
+
int,
|
128
|
+
bounded( min: 0 ),
|
129
|
+
name: name,
|
130
|
+
**options
|
124
131
|
end
|
125
132
|
|
126
|
-
singleton_class.send :alias_method, :unsigned?, :non_neg_int?
|
127
|
-
|
128
133
|
|
129
134
|
# Non-Positive Integer
|
130
135
|
# --------------------
|
@@ -132,8 +137,40 @@ module NRSER::Types
|
|
132
137
|
# negative integers and zero.
|
133
138
|
#
|
134
139
|
|
135
|
-
|
136
|
-
|
140
|
+
def_factory(
|
141
|
+
:NonPositiveInteger,
|
142
|
+
aliases: [ :non_pos_int, :non_positive_int, :non_positive_integer ],
|
143
|
+
) do |name: '{0}∪ℤ⁻', **options|
|
144
|
+
intersection \
|
145
|
+
int,
|
146
|
+
bounded( max: 0 ),
|
147
|
+
name: name,
|
148
|
+
**options
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
def_factory(
|
153
|
+
:Unsigned16BitInteger,
|
154
|
+
aliases: [ :uint16, :ushort ],
|
155
|
+
) do |name: 'uint16', **options|
|
156
|
+
intersection \
|
157
|
+
int,
|
158
|
+
bounded( min: 0, max: ((2 ** 16) - 1) ),
|
159
|
+
name: name,
|
160
|
+
**options
|
137
161
|
end
|
138
|
-
|
162
|
+
|
163
|
+
|
164
|
+
# TODO Move?
|
165
|
+
def_factory(
|
166
|
+
:UNIXPort,
|
167
|
+
aliases: [ :port, ],
|
168
|
+
) do |name: 'port', **options|
|
169
|
+
intersection \
|
170
|
+
int,
|
171
|
+
bounded( min: 1, max: (2**16 - 1) ),
|
172
|
+
name: name,
|
173
|
+
**options
|
174
|
+
end
|
175
|
+
|
139
176
|
end # NRSER::Types
|
data/lib/nrser/types/pairs.rb
CHANGED
@@ -9,7 +9,10 @@
|
|
9
9
|
|
10
10
|
# Project / Package
|
11
11
|
# -----------------------------------------------------------------------
|
12
|
+
require 'nrser/core_ext/hash'
|
13
|
+
|
12
14
|
require_relative './combinators'
|
15
|
+
require_relative './tuples'
|
13
16
|
|
14
17
|
|
15
18
|
# Refinements
|
@@ -27,83 +30,80 @@ module NRSER; end
|
|
27
30
|
|
28
31
|
module NRSER::Types
|
29
32
|
|
30
|
-
|
31
|
-
# @todo Document array_pair method.
|
32
|
-
#
|
33
|
-
# @param [type] arg_name
|
34
|
-
# @todo Add name param description.
|
33
|
+
# Type for key/value pairs encoded as a {.tuple} (Array) of length 2.
|
35
34
|
#
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
def_factory(
|
36
|
+
:array_pair,
|
37
|
+
) do |name: 'ArrayPair', key: any, value: any, **options|
|
38
|
+
unless options.key? :name
|
39
|
+
options[:name] = if key == any && value == any
|
40
|
+
'ArrayPair'
|
41
|
+
else
|
42
|
+
key = NRSER::Types.make key
|
43
|
+
value = NRSER::Types.make value
|
44
|
+
|
45
|
+
"ArrayPair<#{ key.name }, #{ value.name }>"
|
46
|
+
end
|
47
|
+
end
|
44
48
|
|
45
|
-
tuple
|
49
|
+
tuple \
|
50
|
+
key,
|
51
|
+
value,
|
52
|
+
# name: name,
|
53
|
+
**options
|
46
54
|
end # .array_pair
|
47
55
|
|
48
|
-
ARRAY_PAIR = array_pair( name: 'ArrayPairType' ).freeze
|
49
56
|
|
50
|
-
|
51
|
-
# Type for a {Hash} that consists of only a single key and value pair.
|
57
|
+
# Type for key/value pairs encoded as {Hash} with a single entry.
|
52
58
|
#
|
53
59
|
# @param [String] name:
|
54
60
|
# Name to give the new type.
|
55
61
|
#
|
56
62
|
# @param [Hash] **options
|
57
|
-
# Other options to pass to
|
58
|
-
#
|
59
|
-
# @return [NRSER::Types::Type]
|
63
|
+
# Other options to pass to
|
60
64
|
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
def_factory(
|
66
|
+
:hash_pair,
|
67
|
+
) do |key: any, value: any, **options|
|
68
|
+
unless options.key? :name
|
69
|
+
options[:name] = if key == any && value == any
|
70
|
+
'HashPair'
|
71
|
+
else
|
72
|
+
key = NRSER::Types.make key
|
73
|
+
value = NRSER::Types.make value
|
74
|
+
|
75
|
+
"HashPair<#{ key.name }, #{ value.name }>"
|
68
76
|
end
|
69
|
-
}
|
70
|
-
|
71
|
-
if hash_options.empty?
|
72
|
-
intersection is_a( Hash ), length( 1 ), **options
|
73
|
-
else
|
74
|
-
intersection \
|
75
|
-
hash_type( **hash_options ),
|
76
|
-
length( 1 ),
|
77
|
-
**options
|
78
77
|
end
|
79
78
|
|
79
|
+
intersection \
|
80
|
+
hash_type( keys: key, values: value ),
|
81
|
+
length( 1 ),
|
82
|
+
# name: name,
|
83
|
+
**options
|
80
84
|
end # .hash_pair
|
81
85
|
|
82
|
-
HASH_PAIR = hash_pair( name: 'HashPairType' ).freeze
|
83
|
-
|
84
86
|
|
85
|
-
#
|
86
|
-
#
|
87
|
-
# @param [type] arg_name
|
88
|
-
# @todo Add name param description.
|
87
|
+
# A key/value pair, which can be encoded as an Array of length 2 or a
|
88
|
+
# Hash of length 1.
|
89
89
|
#
|
90
|
-
# @return [return_type]
|
91
|
-
# @todo Document return value.
|
92
90
|
#
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
91
|
+
def_factory :pair do |key: any, value: any, **options|
|
92
|
+
unless options.key? :name
|
93
|
+
options[:name] = if key == any && value == any
|
94
|
+
'Pair'
|
95
|
+
else
|
96
|
+
key = NRSER::Types.make key
|
97
|
+
value = NRSER::Types.make value
|
98
|
+
|
99
|
+
"Pair<#{ key.name }, #{ value.name }>"
|
100
|
+
end
|
103
101
|
end
|
102
|
+
|
103
|
+
union \
|
104
|
+
array_pair( key: key, value: value ),
|
105
|
+
hash_pair( key: key, value: value ),
|
106
|
+
**options
|
104
107
|
end # #pair
|
105
108
|
|
106
|
-
PAIR = pair( name: 'PairType' ).freeze
|
107
|
-
|
108
109
|
end # module NRSER::Types
|
109
|
-
|