nrser 0.3.9 → 0.3.10

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.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nrser/char/alpha_numeric_sub.rb +9 -19
  3. data/lib/nrser/char/special.rb +5 -5
  4. data/lib/nrser/core_ext/array.rb +36 -13
  5. data/lib/nrser/core_ext/enumerable.rb +1 -0
  6. data/lib/nrser/core_ext/enumerable/find_map.rb +1 -1
  7. data/lib/nrser/core_ext/hash/bury.rb +3 -0
  8. data/lib/nrser/core_ext/hash/extract_values_at.rb +2 -2
  9. data/lib/nrser/core_ext/method/full_name.rb +1 -1
  10. data/lib/nrser/core_ext/module/method_objects.rb +1 -1
  11. data/lib/nrser/core_ext/module/source_locations.rb +27 -15
  12. data/lib/nrser/core_ext/object/lazy_var.rb +1 -1
  13. data/lib/nrser/core_ext/pathname.rb +67 -12
  14. data/lib/nrser/core_ext/pathname/subpath.rb +86 -0
  15. data/lib/nrser/core_ext/string.rb +28 -1
  16. data/lib/nrser/core_ext/symbol.rb +11 -12
  17. data/lib/nrser/errors/README.md +154 -0
  18. data/lib/nrser/errors/attr_error.rb +146 -53
  19. data/lib/nrser/errors/count_error.rb +61 -12
  20. data/lib/nrser/errors/nicer_error.rb +42 -71
  21. data/lib/nrser/errors/value_error.rb +53 -58
  22. data/lib/nrser/functions.rb +0 -2
  23. data/lib/nrser/functions/enumerable.rb +5 -17
  24. data/lib/nrser/functions/enumerable/associate.rb +14 -5
  25. data/lib/nrser/functions/enumerable/find_all_map.rb +1 -1
  26. data/lib/nrser/functions/enumerable/include_slice/array_include_slice.rb +1 -1
  27. data/lib/nrser/functions/hash/bury.rb +2 -12
  28. data/lib/nrser/functions/merge_by.rb +2 -2
  29. data/lib/nrser/functions/module/method_objects.rb +2 -2
  30. data/lib/nrser/functions/path.rb +185 -165
  31. data/lib/nrser/functions/path/normalized.rb +84 -0
  32. data/lib/nrser/functions/string.rb +4 -4
  33. data/lib/nrser/functions/text/README.md +4 -0
  34. data/lib/nrser/functions/text/format.rb +53 -0
  35. data/lib/nrser/functions/text/indentation.rb +6 -6
  36. data/lib/nrser/functions/text/word_wrap.rb +2 -2
  37. data/lib/nrser/functions/tree/map_leaves.rb +3 -3
  38. data/lib/nrser/functions/tree/map_tree.rb +2 -2
  39. data/lib/nrser/functions/tree/transform.rb +1 -18
  40. data/lib/nrser/gem_ext/README.md +4 -0
  41. data/lib/nrser/labs/README.md +8 -0
  42. data/lib/nrser/labs/config.rb +163 -0
  43. data/lib/nrser/labs/i8.rb +49 -159
  44. data/lib/nrser/labs/i8/struct.rb +167 -0
  45. data/lib/nrser/labs/i8/struct/hash.rb +140 -0
  46. data/lib/nrser/labs/i8/struct/vector.rb +149 -0
  47. data/lib/nrser/labs/i8/surjection.rb +211 -0
  48. data/lib/nrser/labs/lots/consumer.rb +19 -0
  49. data/lib/nrser/labs/lots/parser.rb +21 -1
  50. data/lib/nrser/labs/stash.rb +4 -4
  51. data/lib/nrser/log.rb +25 -21
  52. data/lib/nrser/log/appender/sync.rb +15 -11
  53. data/lib/nrser/log/formatters/color.rb +0 -3
  54. data/lib/nrser/log/formatters/mixin.rb +4 -4
  55. data/lib/nrser/log/logger.rb +54 -6
  56. data/lib/nrser/log/mixin.rb +2 -1
  57. data/lib/nrser/log/plugin.rb +6 -6
  58. data/lib/nrser/log/types.rb +46 -29
  59. data/lib/nrser/mean_streak.rb +0 -8
  60. data/lib/nrser/mean_streak/document.rb +1 -4
  61. data/lib/nrser/message.rb +3 -3
  62. data/lib/nrser/meta/README.md +4 -0
  63. data/lib/nrser/meta/lazy_attr.rb +2 -2
  64. data/lib/nrser/meta/source/location.rb +1 -1
  65. data/lib/nrser/props.rb +34 -3
  66. data/lib/nrser/props/class_methods.rb +2 -1
  67. data/lib/nrser/props/instance_methods.rb +9 -9
  68. data/lib/nrser/props/metadata.rb +4 -12
  69. data/lib/nrser/props/mutable/stash.rb +5 -2
  70. data/lib/nrser/props/prop.rb +10 -19
  71. data/lib/nrser/rspex.rb +1 -20
  72. data/lib/nrser/rspex/example_group/describe_attribute.rb +3 -0
  73. data/lib/nrser/rspex/example_group/describe_called_with.rb +9 -4
  74. data/lib/nrser/rspex/example_group/describe_case.rb +1 -0
  75. data/lib/nrser/rspex/example_group/describe_class.rb +2 -0
  76. data/lib/nrser/rspex/example_group/describe_group.rb +1 -1
  77. data/lib/nrser/rspex/example_group/describe_instance.rb +3 -1
  78. data/lib/nrser/rspex/example_group/describe_message.rb +1 -1
  79. data/lib/nrser/rspex/example_group/describe_method.rb +64 -30
  80. data/lib/nrser/rspex/example_group/describe_response_to.rb +1 -1
  81. data/lib/nrser/rspex/example_group/describe_section.rb +4 -1
  82. data/lib/nrser/rspex/example_group/describe_sent_to.rb +1 -1
  83. data/lib/nrser/rspex/example_group/describe_setup.rb +1 -0
  84. data/lib/nrser/rspex/example_group/describe_source_file.rb +1 -1
  85. data/lib/nrser/rspex/example_group/describe_spec_file.rb +4 -2
  86. data/lib/nrser/rspex/example_group/describe_when.rb +2 -1
  87. data/lib/nrser/rspex/example_group/describe_x.rb +5 -5
  88. data/lib/nrser/rspex/format.rb +0 -15
  89. data/lib/nrser/sugar/method_missing_forwarder.rb +3 -3
  90. data/lib/nrser/sys/env/path.rb +2 -28
  91. data/lib/nrser/types.rb +63 -12
  92. data/lib/nrser/types/README.md +76 -0
  93. data/lib/nrser/types/arrays.rb +192 -137
  94. data/lib/nrser/types/attributes.rb +269 -0
  95. data/lib/nrser/types/booleans.rb +134 -83
  96. data/lib/nrser/types/bounded.rb +110 -47
  97. data/lib/nrser/types/collections.rb +119 -0
  98. data/lib/nrser/types/combinators.rb +283 -196
  99. data/lib/nrser/types/doc/display_table.md +66 -0
  100. data/lib/nrser/types/eqiuvalent.rb +91 -0
  101. data/lib/nrser/types/errors/check_error.rb +5 -11
  102. data/lib/nrser/types/errors/from_string_error.rb +3 -3
  103. data/lib/nrser/types/factory.rb +287 -20
  104. data/lib/nrser/types/hashes.rb +227 -179
  105. data/lib/nrser/types/in.rb +73 -36
  106. data/lib/nrser/types/is.rb +67 -60
  107. data/lib/nrser/types/is_a.rb +141 -84
  108. data/lib/nrser/types/labels.rb +45 -16
  109. data/lib/nrser/types/maybe.rb +6 -3
  110. data/lib/nrser/types/nil.rb +64 -27
  111. data/lib/nrser/types/not.rb +92 -34
  112. data/lib/nrser/types/numbers.rb +224 -169
  113. data/lib/nrser/types/pairs.rb +113 -89
  114. data/lib/nrser/types/paths.rb +250 -137
  115. data/lib/nrser/types/responds.rb +167 -89
  116. data/lib/nrser/types/selector.rb +234 -0
  117. data/lib/nrser/types/shape.rb +136 -65
  118. data/lib/nrser/types/strings.rb +189 -63
  119. data/lib/nrser/types/symbols.rb +83 -33
  120. data/lib/nrser/types/top.rb +89 -0
  121. data/lib/nrser/types/tuples.rb +134 -98
  122. data/lib/nrser/types/type.rb +617 -505
  123. data/lib/nrser/types/when.rb +123 -98
  124. data/lib/nrser/types/where.rb +182 -91
  125. data/lib/nrser/version.rb +1 -1
  126. data/spec/lib/nrser/core_ext/pathname/subpath_spec.rb +22 -0
  127. data/spec/lib/nrser/errors/attr_error_spec.rb +68 -0
  128. data/spec/lib/nrser/errors/count_error_spec.rb +69 -0
  129. data/spec/lib/nrser/functions/path/normalize_path_spec.rb +35 -0
  130. data/spec/lib/nrser/functions/tree/map_tree_spec.rb +74 -96
  131. data/spec/lib/nrser/functions/tree/transform_spec.rb +11 -11
  132. data/spec/lib/nrser/labs/config_spec.rb +22 -0
  133. data/spec/lib/nrser/labs/i8/struct_spec.rb +39 -0
  134. data/spec/lib/nrser/types/display_spec.rb +50 -0
  135. data/spec/lib/nrser/types/paths_spec.rb +16 -10
  136. data/spec/lib/nrser/types/selector_spec.rb +125 -0
  137. data/spec/spec_helper.rb +4 -5
  138. metadata +105 -22
  139. data/lib/nrser/types/any.rb +0 -41
  140. data/lib/nrser/types/attrs.rb +0 -213
  141. data/lib/nrser/types/trees.rb +0 -42
@@ -0,0 +1,167 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Project / Package
8
+ # -----------------------------------------------------------------------
9
+ require 'nrser/errors/argument_error'
10
+ require 'nrser/labs/i8'
11
+
12
+ require_relative './struct/hash'
13
+ require_relative './struct/vector'
14
+
15
+
16
+ # Refinements
17
+ # ========================================================================
18
+
19
+ require 'nrser/refinements/types'
20
+ using NRSER::Types
21
+
22
+
23
+ # Namespace
24
+ # ========================================================================
25
+
26
+ module I8
27
+
28
+
29
+ # Definitions
30
+ # ========================================================================
31
+
32
+ # `I8::Struct` is an immutable rendition of the Ruby standard lib `::Struct`
33
+ # using the {NRSER::Props} system.
34
+ #
35
+ # It's intended to help make it quick and easy to create little immutable
36
+ # propertied objects, with all the type-checking and serialization stuff
37
+ # that comes with {NRSER::Props}.
38
+ #
39
+ # `Struct` itself is a module with a {.new} method that creates new subclasses
40
+ # of either {I8::Struct::Hash} or {I8::Struct::Vector}, which themselves
41
+ # are respective subclasses of {I8::Hash} and {I8::Vector}, and include
42
+ # {NRSER::Props::Immutable::Hash} and {NRSER::Props::Immutable::Vector}.
43
+ #
44
+ # ### Identifying Classes Built by `I8::Struct`
45
+ #
46
+ # Both {I8::Struct::Hash} and {I8::Struct::Vector} also include `I8::Struct`
47
+ # itself for the convenience of shit like:
48
+ #
49
+ # Point = I8::Struct.new x: t.int, y: t.int
50
+ #
51
+ # Point.included_modules.include? I8::Struct
52
+ # # => true
53
+ #
54
+ # p = Point.new x: 1, y: 2
55
+ # p.is_a? I8::Struct
56
+ # # => true
57
+ #
58
+ # `I8::Struct` has only class (static) methods, so no functionality is
59
+ # actually added from `include I8::Struct`.
60
+ #
61
+ # ### Gotchas
62
+ #
63
+ # The code below *doesn't* work how you might want or expect it:
64
+ #
65
+ # Point = I8::Struct.new x: t.int, y: t.int
66
+ # Point.is_a? I8::Struct
67
+ # # => false
68
+ #
69
+ # Opposed to how {Class} works:
70
+ #
71
+ # C = Class.new
72
+ # C.is_a? Class
73
+ # # => true
74
+ #
75
+ # However, this *is* the same as how the stdlib's [::Struct][] behaves:
76
+ #
77
+ # S = ::Struct.new :x
78
+ # S.is_a? ::Struct
79
+ # # => false
80
+ #
81
+ # [::Struct]: https://ruby-doc.org/core/Struct.html
82
+ #
83
+ # @example One-Liner
84
+ # Person = I8::Struct.new name: t.non_empty_str, age: t.non_neg_int
85
+ # nrser = Person.new name: "Neil", age: 34
86
+ #
87
+ # @example Extend a `I8::Struct` to add methods
88
+ # class Rectangle \
89
+ # < I8::Struct.new( width: t.non_neg_int, length: t.non_neg_int )
90
+ #
91
+ # def area
92
+ # width * length
93
+ # end
94
+ #
95
+ # end # class Rectangle
96
+ #
97
+ module Struct
98
+
99
+ # Check args that were passed to {.new}.
100
+ #
101
+ # @!visibility private
102
+ #
103
+ # @param vector_prop_defs (see .new)
104
+ # @param hash_prop_defs (see .new)
105
+ #
106
+ def self.check_new_args! vector_prop_defs, hash_prop_defs
107
+
108
+ unless (vector_prop_defs.empty? && !hash_prop_defs.empty?) ||
109
+ (!vector_prop_defs.empty? && hash_prop_defs.empty?)
110
+
111
+ raise NRSER::ArgumentError.new \
112
+ "Exactly one of *args or **kwds must be empty",
113
+
114
+ args: vector_prop_defs,
115
+
116
+ kwds: hash_prop_defs,
117
+
118
+ details: -> {%{
119
+ {I8::Struct.new} proxies to either
120
+
121
+ 1. {I8::Struct::Vector.new}
122
+ 2. {I8::Struct::Hash.new}
123
+
124
+ depending on *where* the property definitions are passed:
125
+
126
+ 1. Positionally in `*args` -> {I8::Struct::Vector.new}
127
+ 2. By name in `**kwds` -> {I8::Struct::Hash.new}
128
+
129
+ Examples:
130
+
131
+ 1. Create a Point struct backed by an {I8::Vector}:
132
+
133
+ Point = I8::Struct.new [x: t.int], [y: t.int]
134
+
135
+ 2. Create a Point struct backed by an {I8::Hash}:
136
+
137
+ Point = I8::Struct.new x: t.int, y: t.int
138
+
139
+ }}
140
+
141
+ end # unless vector_prop_defs.empty? XOR hash_prop_defs.empty?
142
+
143
+ end # .check_new_args!
144
+
145
+ private_class_method :check_new_args!
146
+
147
+
148
+ def self.new *vector_prop_defs, **hash_prop_defs, &class_body
149
+ check_new_args! vector_prop_defs, hash_prop_defs
150
+
151
+ if !vector_prop_defs.empty?
152
+ raise NotImplementedError.new "I8::Struct::Vector is TODO, sorry"
153
+ # I8::Struct::Vector.new *vector_prop_defs, &class_body
154
+ else
155
+ I8::Struct::Hash.new **hash_prop_defs, &class_body
156
+ end
157
+ end
158
+
159
+
160
+ end # module Struct
161
+
162
+
163
+ # /Namespace
164
+ # ========================================================================
165
+
166
+ end # module I8
167
+
@@ -0,0 +1,140 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Project / Package
8
+ # -----------------------------------------------------------------------
9
+
10
+ require 'nrser/errors/argument_error'
11
+ require 'nrser/props/immutable/hash'
12
+
13
+
14
+ # Refinements
15
+ # ========================================================================
16
+
17
+ require 'nrser/refinements/types'
18
+ using NRSER::Types
19
+
20
+
21
+ # Namespace
22
+ # ========================================================================
23
+
24
+ module I8
25
+ module Struct
26
+
27
+
28
+ # Definitions
29
+ # ========================================================================
30
+
31
+ # Base class for {I8::Hash}-based "propertied" ({NRSER::Props}) structs
32
+ # created by {I8::Struct.new}.
33
+ #
34
+ # @see I8::Struct
35
+ # @see NRSER::Props
36
+ # @see NRSER::Props::Immutable::Hash
37
+ #
38
+ class Hash < I8::Hash
39
+
40
+ include I8::Struct
41
+ include NRSER::Props::Immutable::Hash
42
+
43
+ # This method does two totally different things depending on what `self`
44
+ # is:
45
+ #
46
+ # 1. If `self` is {I8::Struct::Hash}, we want to build a new struct class.
47
+ #
48
+ # 2. Otherwise, we want to defer up to `super` to create a new instance
49
+ # of `self`.
50
+ #
51
+ # @overload self.new **prop_defs, &class_body
52
+ # When `self` **is** {I8::Struct::Hash}, the method builds a new
53
+ # subclass, along the lines of how {I8::Struct.new} and `::Struct.new`
54
+ # work.
55
+ #
56
+ # @example
57
+ # Point = I8::Struct::Hash.new x: t.int, y: t.int
58
+ # # => Point
59
+ #
60
+ # @param [Hash<Symbol, (NRSER::Types::Type | Hash<Symbol, Object>)>] prop_defs
61
+ # Map of property names to the value(s) needed to create them.
62
+ #
63
+ # `prop_defs` values can each be:
64
+ #
65
+ # 1. {NRSER::Types::Type} - used as the {NRSER::Props::Prop#type}, with
66
+ # all the {NRSER::Props::Prop}'s other values left as defaults.
67
+ #
68
+ # 2. {Hash<Symbol, Object>} - full prop configuration, passed in to
69
+ # {NRSER::Props::Metadata#prop}.
70
+ #
71
+ # @param [Proc?] class_body
72
+ # Optional block to evaluate as the new class's body.
73
+ #
74
+ # @return [Class<I8::Struct::Hash>]
75
+ # New structure class.
76
+ #
77
+ # @overload self.new *args, **kwds, &block
78
+ # When `self` **is not** {I8::Struct::Hash}, this method simply forwards
79
+ # all parameters up to it's super method, which will create a new
80
+ # instance as usual.
81
+ #
82
+ # @example
83
+ # Point < I8::Struct::Hash
84
+ # # => true
85
+ #
86
+ # Point.new x: 1, y: 2 # Passes through to super method to construct
87
+ # # => Point[:y => 2, :x => 1]
88
+ #
89
+ # @return [I8::Struct::Hash]
90
+ # New instance.
91
+ #
92
+ def self.new *args, **kwds, &block
93
+ # Are we {I8::Struct::Hash}? (See method doc).
94
+ if self == I8::Struct::Hash
95
+ # Yes, we are. Time to build a new struct class.
96
+
97
+ # Make sure we weren't given an positional `args`.
98
+ unless args.empty?
99
+ raise NRSER::ArgumentError.new \
100
+ "Can not supply positional args when building new",
101
+ "{I8::Struct::Hash}",
102
+ args: args,
103
+ kwds: kwds
104
+ end
105
+
106
+ # Create the new subclass
107
+ Class.new( I8::Struct::Hash ) do
108
+ kwds.each do |name, value|
109
+ prop_kwds = t.match value,
110
+ t.type, ->( type ) {{ type: type }},
111
+ t.hash_, value
112
+
113
+ prop name, **prop_kwds
114
+ end
115
+
116
+ class_exec &block if block
117
+ end
118
+
119
+ else
120
+ # No, we are a built struct. Defer up to `super` to create an instance.
121
+
122
+ # NOTE Weirdness ahead. See NOTE in {I8::Struct::Vector.new}
123
+ if kwds.empty?
124
+ super( *args, &block )
125
+ else
126
+ super( *args, **kwds, &block )
127
+ end
128
+
129
+ end
130
+ end # .new
131
+
132
+ end # class Hash
133
+
134
+
135
+ # /Namespace
136
+ # ========================================================================
137
+
138
+ end # module Struct
139
+ end # module I8
140
+
@@ -0,0 +1,149 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Project / Package
8
+ # -----------------------------------------------------------------------
9
+
10
+ require 'nrser/errors/argument_error'
11
+ require 'nrser/props/immutable/vector'
12
+
13
+
14
+ # Refinements
15
+ # ========================================================================
16
+
17
+ require 'nrser/refinements/types'
18
+ using NRSER::Types
19
+
20
+
21
+ # Namespace
22
+ # ========================================================================
23
+
24
+ module I8
25
+ module Struct
26
+
27
+
28
+ # Definitions
29
+ # ========================================================================
30
+
31
+ # Base class for {I8::Vector}-based "propertied" ({NRSER::Props}) structs
32
+ # created by {I8::Struct.new}.
33
+ #
34
+ # @see I8::Struct
35
+ # @see NRSER::Props
36
+ # @see NRSER::Props::Immutable::Vector
37
+ #
38
+ class Vector < I8::Vector
39
+ include I8::Struct
40
+ include NRSER::Props::Immutable::Vector
41
+
42
+ # Check out {I8::Struct::Hash} for a general idea of how this method works,
43
+ # I don't want to duplicate the explanation.
44
+ #
45
+ # @overload self.new *prop_defs, &class_body
46
+ # Create a new struct class.
47
+ #
48
+ # @example Using array-wrapping for prop defs
49
+ # Point = I8::Struct::Vector.new [x: t.int], [y: t.int]
50
+ # # => Point
51
+ #
52
+ # @example Using hashes for prop defs
53
+ # Point = I8::Struct::Vector.new( {x: t.int}, {y: t.int} )
54
+ # # => Point
55
+ #
56
+ # @example Providing additional prop options
57
+ # Point = I8::Struct::Vector.new \
58
+ # [x: {type: t.int, default: 0}],
59
+ # [y: {type: t.int, default: 0}]
60
+ # # => Point
61
+ #
62
+ # @param [Array] prop_defs
63
+ # Each entry must be a pair; the first entry must be the name as a
64
+ # symbol, the second is either the prop's type or a hash of options
65
+ # for creating the prop.
66
+ #
67
+ # Look at the examples.
68
+ #
69
+ # @param [Proc?] class_body
70
+ # Optional block to evaluate as the new class's body.
71
+ #
72
+ # @return [Class<I8::Struct::Vector>]
73
+ # New structure class.
74
+ #
75
+ # @overload self.new *args, **kwds, &block
76
+ # Create a new instance.
77
+ #
78
+ # @return [I8::Struct::Vector]
79
+ # New instance.
80
+ #
81
+ def self.new *args, **kwds, &block
82
+ # Are we {I8::Struct::Vector}? (See method doc).
83
+ if self == I8::Struct::Vector
84
+ unless kwds.empty?
85
+ raise NRSER::ArgumentError.new \
86
+ "Can not supply keyword args",
87
+ args: args,
88
+ kwds: kwds
89
+ end
90
+
91
+ # Unwrap `[name: type]` format
92
+ prop_defs = args.map { |prop_def|
93
+ if ::Array === prop_def &&
94
+ prop_def.length == 1 &&
95
+ ::Hash === prop_def[0]
96
+ prop_def[0]
97
+ else
98
+ prop_def
99
+ end
100
+ }
101
+
102
+ # Check we have a list of pairs with label keys
103
+ t.array( t.pair( key: t.label ) ).check! prop_defs
104
+
105
+ Class.new( I8::Struct::Vector ) do
106
+ prop_defs.each_with_index do |pair, index|
107
+ name, value = pair.first
108
+
109
+ kwds = t.match value,
110
+ t.type, ->( type ) {{ type: type }},
111
+ t.hash_, value
112
+
113
+ prop name, **kwds, index: index
114
+ end
115
+
116
+ class_exec &block if block
117
+ end
118
+
119
+ else
120
+ # No, we are a built struct. Defer up to `super` to create an instance.
121
+
122
+ # NOTE This is... weird. Just doing the normal
123
+ #
124
+ # super( *args, **kwds, &block )
125
+ #
126
+ # results in `*args` becoming `[*args, {}]` up the super chain
127
+ # when `kwds` is empty.
128
+ #
129
+ # I can't say I can understand it, but I seem to be able to fix
130
+ # it.
131
+ #
132
+ if kwds.empty?
133
+ super( *args, &block )
134
+ else
135
+ super( *args, **kwds, &block )
136
+ end
137
+
138
+ end
139
+ end # .new
140
+
141
+ end # class Struct::Vector
142
+
143
+
144
+ # /Namespace
145
+ # ========================================================================
146
+
147
+ end # module Struct
148
+ end # module I8
149
+