vector_number 0.3.0 → 0.3.1

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.
data/lib/vector_number.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "vector_number/version"
4
- require_relative "vector_number/mathing"
5
- require_relative "vector_number/math_converting"
3
+ require_relative "vector_number/comparing"
6
4
  require_relative "vector_number/converting"
7
5
  require_relative "vector_number/enumerating"
8
- require_relative "vector_number/comparing"
6
+ require_relative "vector_number/math_converting"
7
+ require_relative "vector_number/mathing"
9
8
  require_relative "vector_number/querying"
10
9
  require_relative "vector_number/stringifying"
10
+ require_relative "vector_number/version"
11
11
 
12
12
  # A class to add together anything.
13
13
  class VectorNumber
@@ -19,38 +19,84 @@ class VectorNumber
19
19
  include Querying
20
20
  include Stringifying
21
21
 
22
+ # Keys for possible options.
23
+ # Unknown options will be rejected when creating a vector.
24
+ #
22
25
  # @return [Array<Symbol>]
26
+ #
27
+ # @since 0.2.0
23
28
  KNOWN_OPTIONS = %i[mult].freeze
24
29
 
30
+ # Default values for options.
31
+ #
25
32
  # @return [Hash{Symbol => Object}]
33
+ #
34
+ # @since 0.2.0
26
35
  DEFAULT_OPTIONS = { mult: :dot }.freeze
27
36
 
28
37
  # Get a unit for +n+th numeric dimension, where 1 is real, 2 is imaginary.
38
+ #
39
+ # @since 0.2.0
29
40
  UNIT = ->(n) { (n - 1).i }.freeze
30
41
  # Constant for real unit.
42
+ #
43
+ # @since 0.2.0
31
44
  R = UNIT[1]
32
45
  # Constant for imaginary unit.
46
+ #
47
+ # @since 0.1.0
33
48
  I = UNIT[2]
34
49
 
35
- # Number of non-zero dimensions.
36
- # @return [Integer]
37
- attr_reader :size
38
- # @return [Hash{Symbol => Object}]
39
- attr_reader :options
40
-
41
- # Create new VectorNumber from +values+.
50
+ # Create new VectorNumber from a list of values, possibly specifying options.
42
51
  #
43
52
  # @example
44
- # VectorNumber[1, 2, 3] #=> (6)
45
- # VectorNumber[[1, 2, 3]] #=> (1⋅[1, 2, 3])
46
- # VectorNumber['b', VectorNumber::I, mult: :asterisk] #=> (1*'b' + 1i)
53
+ # VectorNumber[1, 2, 3] # => (6)
54
+ # VectorNumber[[1, 2, 3]] # => (1⋅[1, 2, 3])
55
+ # VectorNumber["b", VectorNumber::I, mult: :asterisk] # => (1*'b' + 1i)
56
+ # VectorNumber[] # => (0)
57
+ # VectorNumber["b", VectorNumber["b"]] # => (2⋅'b')
58
+ # VectorNumber["a", "b", "a"] # => (2⋅'a' + 1⋅'b')
59
+ #
47
60
  # @param values [Array<Object>] values to put in the number
48
61
  # @param options [Hash{Symbol => Object}] options for the number
62
+ # @option options [Symbol, String] :mult Multiplication symbol,
63
+ # either a key from {MULT_STRINGS} or a literal string to use
49
64
  # @return [VectorNumber]
65
+ #
66
+ # @since 0.1.0
50
67
  def self.[](*values, **options)
51
68
  new(values, options)
52
69
  end
53
70
 
71
+ # Number of non-zero dimensions.
72
+ #
73
+ # @return [Integer]
74
+ #
75
+ # @since 0.1.0
76
+ attr_reader :size
77
+
78
+ # Options used for this vector.
79
+ #
80
+ # @see KNOWN_OPTIONS
81
+ #
82
+ # @return [Hash{Symbol => Object}]
83
+ #
84
+ # @since 0.1.0
85
+ attr_reader :options
86
+
87
+ # Create new VectorNumber from +values+, possibly specifying +options+,
88
+ # possibly modifying coefficients with a block.
89
+ #
90
+ # @example
91
+ # VectorNumber.new(1, 2, 3) # ArgumentError
92
+ # VectorNumber.new([1, 2, 3]) # => (6)
93
+ # VectorNumber.new(["b", VectorNumber::I], mult: :asterisk) # => (1*'b' + 1i)
94
+ # VectorNumber.new # => (0)
95
+ # @example with a block
96
+ # VectorNumber.new(["a", "b", "c", 3]) { _1 * 2 } # => (2⋅'a' + 2⋅'b' + 2⋅'c' + 6)
97
+ # VectorNumber.new(["a", "b", "c", 3], &:-@) # => (-1⋅'a' - 1⋅'b' - 1⋅'c' - 3)
98
+ # VectorNumber.new(["a", "b", "c", 3], &:digits) # RangeError
99
+ #
54
100
  # @param values [Array, Hash{Object => Integer, Float, Rational, BigDecimal}, VectorNumber]
55
101
  # values for this number, hashes are treated like plain vector numbers
56
102
  # @param options [Hash{Symbol => Object}]
@@ -62,7 +108,7 @@ class VectorNumber
62
108
  # @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
63
109
  # @raise [RangeError] if any pesky non-reals get where they shouldn't
64
110
  def initialize(values = nil, options = nil, &)
65
- # @type var options: Hash[Symbol, Symbol]
111
+ # @type var options: Hash[Symbol, Object]
66
112
  initialize_from(values)
67
113
  apply_transform(&)
68
114
  finalize_contents
@@ -75,13 +121,18 @@ class VectorNumber
75
121
  # Return self.
76
122
  #
77
123
  # @return [VectorNumber]
78
- alias dup itself
124
+ #
125
+ # @since 0.2.0
126
+ def +@ = self
127
+ # @since 0.2.4
128
+ alias dup +@
79
129
 
80
130
  # Return self.
81
131
  #
82
- # Raises ArgumentError if +freeze+ is not +true+ or +nil+.
83
- #
84
132
  # @return [VectorNumber]
133
+ # @raise [ArgumentError] if +freeze+ is not +true+ or +nil+.
134
+ #
135
+ # @since 0.2.4
85
136
  def clone(freeze: true)
86
137
  case freeze
87
138
  when true, nil
@@ -96,6 +147,7 @@ class VectorNumber
96
147
  private
97
148
 
98
149
  # Create new VectorNumber from a value or self, optionally applying a transform.
150
+ #
99
151
  # @param from [Object] self if not specified
100
152
  # @yieldparam coefficient [Integer, Float, Rational, BigDecimal]
101
153
  # @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
@@ -104,14 +156,22 @@ class VectorNumber
104
156
  self.class.new(from, options, &)
105
157
  end
106
158
 
159
+ # Check if +other+ is a real number.
160
+ #
161
+ # Currently this is either a +real?+ Numeric or +numeric?(1)+ VectorNumber.
162
+ #
107
163
  # @param value [Object]
108
164
  # @return [Boolean]
165
+ #
166
+ # @since 0.1.0
109
167
  def real_number?(value)
110
168
  (value.is_a?(Numeric) && value.real?) || (value.is_a?(self.class) && value.numeric?(1))
111
169
  end
112
170
 
113
171
  # @param values [Array, Hash{Object => Integer, Float, Rational, BigDecimal}, VectorNumber, nil]
114
172
  # @return [void]
173
+ #
174
+ # @since 0.1.0
115
175
  def initialize_from(values)
116
176
  @data = Hash.new(0)
117
177
 
@@ -127,6 +187,8 @@ class VectorNumber
127
187
 
128
188
  # @param value [VectorNumber, Numeric, Object]
129
189
  # @return [void]
190
+ #
191
+ # @since 0.1.0
130
192
  def add_value_to_data(value)
131
193
  case value
132
194
  when Numeric
@@ -140,6 +202,8 @@ class VectorNumber
140
202
 
141
203
  # @param value [Numeric]
142
204
  # @return [void]
205
+ #
206
+ # @since 0.1.0
143
207
  def add_numeric_value_to_data(value)
144
208
  @data[R] += value.real
145
209
  @data[I] += value.imaginary
@@ -147,6 +211,8 @@ class VectorNumber
147
211
 
148
212
  # @param vector [VectorNumber, Hash{Object => Integer, Float, Rational, BigDecimal}]
149
213
  # @return [void]
214
+ #
215
+ # @since 0.1.0
150
216
  def add_vector_to_data(vector)
151
217
  vector.each_pair do |unit, coefficient|
152
218
  raise RangeError, "#{coefficient} is not a real number" unless real_number?(coefficient)
@@ -159,6 +225,8 @@ class VectorNumber
159
225
  # @yieldreturn [Integer, Float, Rational, BigDecimal]
160
226
  # @return [void]
161
227
  # @raise [RangeError]
228
+ #
229
+ # @since 0.1.0
162
230
  def apply_transform
163
231
  return unless block_given?
164
232
 
@@ -173,6 +241,8 @@ class VectorNumber
173
241
  # @param options [Hash{Symbol => Object}, nil]
174
242
  # @param values [Object] initializing object
175
243
  # @return [void]
244
+ #
245
+ # @since 0.1.0
176
246
  def save_options(options, values:)
177
247
  @options =
178
248
  case [options, values]
@@ -191,6 +261,11 @@ class VectorNumber
191
261
  end
192
262
  end
193
263
 
264
+ # @param base_options [Hash{Symbol => Object}]
265
+ # @param added_options [Hash{Symbol => Object}]
266
+ # @return [Hash{Symbol => Object}]
267
+ #
268
+ # @since 0.3.0
194
269
  def merge_options(base_options, added_options)
195
270
  # Optimization for the common case of passing options through #new.
196
271
  return base_options if added_options.equal?(base_options)
@@ -200,16 +275,20 @@ class VectorNumber
200
275
 
201
276
  # Compact coefficients, calculate size and freeze data.
202
277
  # @return [void]
278
+ #
279
+ # @since 0.1.0
203
280
  def finalize_contents
204
281
  @data.delete_if { |_u, c| c.zero? }
205
282
  @data.freeze
206
283
  @size = @data.size
207
284
  end
208
285
 
286
+ # @since 0.2.0
209
287
  def default_options
210
288
  DEFAULT_OPTIONS
211
289
  end
212
290
 
291
+ # @since 0.2.0
213
292
  def known_options
214
293
  KNOWN_OPTIONS
215
294
  end
@@ -55,7 +55,8 @@ class VectorNumber
55
55
  ?{ (coefficient_type coefficient) -> coefficient_type }
56
56
  -> void
57
57
 
58
- def dup: () -> self
58
+ def +@: () -> self
59
+ alias dup +@
59
60
 
60
61
  def clone: (?freeze: bool?) -> self
61
62
 
@@ -76,6 +77,7 @@ class VectorNumber
76
77
  def apply_transform: () ?{ (coefficient_type value) -> coefficient_type } -> void
77
78
 
78
79
  def save_options: (options_type? options, values: in_value_type) -> void
80
+ def merge_options: (options_type base_options, options_type added_options) -> options_type
79
81
  def default_options: () -> options_type
80
82
  def known_options: () -> list[Symbol]
81
83
 
@@ -87,8 +89,6 @@ class VectorNumber
87
89
 
88
90
  def coerce: (in_value_type) -> [vector_type, self]
89
91
 
90
- def +@: () -> self
91
-
92
92
  def -@: () -> vector_type
93
93
  alias neg -@
94
94
 
metadata CHANGED
@@ -1,21 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vector_number
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Bulancov
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-05-12 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  executables: []
13
13
  extensions: []
14
14
  extra_rdoc_files:
15
- - README.md
16
15
  - CHANGELOG.md
16
+ - LICENSE.txt
17
+ - README.md
17
18
  files:
18
19
  - CHANGELOG.md
20
+ - LICENSE.txt
19
21
  - README.md
20
22
  - lib/vector_number.rb
21
23
  - lib/vector_number/comparing.rb
@@ -33,12 +35,16 @@ licenses:
33
35
  - MIT
34
36
  metadata:
35
37
  homepage_uri: https://github.com/trinistr/vector_number
36
- source_code_uri: https://github.com/trinistr/vector_number
37
- changelog_uri: https://github.com/trinistr/vector_number/CHANGELOG.md
38
+ bug_tracker_uri: https://github.com/trinistr/vector_number/issues
39
+ documentation_uri: https://rubydoc.info/gems/vector_number/0.3.1
40
+ source_code_uri: https://github.com/trinistr/vector_number/tree/v0.3.1
41
+ changelog_uri: https://github.com/trinistr/vector_number/blob/v0.3.1/CHANGELOG.md
38
42
  rubygems_mfa_required: 'true'
39
43
  rdoc_options:
40
44
  - "--main"
41
45
  - README.md
46
+ - "--files"
47
+ - CHANGELOG.md,LICENSE.txt
42
48
  require_paths:
43
49
  - lib
44
50
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -52,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
58
  - !ruby/object:Gem::Version
53
59
  version: '0'
54
60
  requirements: []
55
- rubygems_version: 3.6.5
61
+ rubygems_version: 3.6.8
56
62
  specification_version: 4
57
63
  summary: A library to add together anything.
58
64
  test_files: []