vector_number 0.2.6 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +72 -6
- data/LICENSE.txt +21 -0
- data/README.md +21 -13
- data/lib/vector_number/comparing.rb +55 -2
- data/lib/vector_number/converting.rb +86 -6
- data/lib/vector_number/enumerating.rb +70 -13
- data/lib/vector_number/math_converting.rb +66 -6
- data/lib/vector_number/mathing.rb +215 -35
- data/lib/vector_number/numeric_refinements.rb +33 -9
- data/lib/vector_number/querying.rb +84 -15
- data/lib/vector_number/stringifying.rb +32 -2
- data/lib/vector_number/version.rb +2 -2
- data/lib/vector_number.rb +114 -29
- data/sig/vector_number.rbs +10 -4
- metadata +12 -6
@@ -5,12 +5,21 @@ class VectorNumber
|
|
5
5
|
# Mostly modeled after {::Complex}.
|
6
6
|
module Querying
|
7
7
|
# Whether this VectorNumber can be considered strictly numeric, e.g. real or complex.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# VectorNumber[2].numeric? # => true
|
11
|
+
# VectorNumber[2, 3i].numeric? # => true
|
12
|
+
# VectorNumber[2, "a"].numeric? # => false
|
13
|
+
# VectorNumber[2, 3i].numeric?(1) # => false
|
14
|
+
#
|
8
15
|
# @param dimensions [Integer] number of dimensions to consider "numeric"
|
9
16
|
# - 0 — zero
|
10
17
|
# - 1 — real number
|
11
18
|
# - 2 — complex number, etc.
|
12
19
|
# @return [Boolean]
|
13
20
|
# @raise [ArgumentError] if +dimensions+ is negative
|
21
|
+
#
|
22
|
+
# @since 0.2.0
|
14
23
|
def numeric?(dimensions = 2)
|
15
24
|
raise ArgumentError, "`dimensions` must be non-negative" unless dimensions >= 0
|
16
25
|
|
@@ -18,64 +27,124 @@ class VectorNumber
|
|
18
27
|
end
|
19
28
|
|
20
29
|
# Whether this VectorNumber contains any non-numeric parts.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# VectorNumber[2].nonnumeric? # => false
|
33
|
+
# VectorNumber[2, 3i].nonnumeric? # => false
|
34
|
+
# VectorNumber[2, "a"].nonnumeric? # => true
|
35
|
+
# VectorNumber[2, 3i].nonnumeric?(1) # => true
|
36
|
+
#
|
21
37
|
# @param (see #numeric?)
|
22
38
|
# @return (see #numeric?)
|
23
39
|
# @raise (see #numeric?)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
!numeric?(dimensions)
|
28
|
-
end
|
40
|
+
#
|
41
|
+
# @since 0.2.1
|
42
|
+
def nonnumeric?(dimensions = 2) = !numeric?(dimensions)
|
29
43
|
|
30
44
|
# Returns +true+ if all coefficients are finite, +false+ otherwise.
|
45
|
+
#
|
46
|
+
# @example
|
47
|
+
# VectorNumber[2].finite? # => true
|
48
|
+
# VectorNumber[Float::NAN].finite? # => false
|
49
|
+
# VectorNumber["a"].mult(Float::INFINITY).finite? # => false
|
50
|
+
#
|
31
51
|
# @return [Boolean]
|
52
|
+
#
|
53
|
+
# @since 0.1.0
|
32
54
|
def finite?
|
33
55
|
all? { |_u, v| v.finite? }
|
34
56
|
end
|
35
57
|
|
36
58
|
# Returns +1+ if any coefficients are infinite, +nil+ otherwise.
|
59
|
+
#
|
60
|
+
# This behavior is the same as +Complex+'s.
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# VectorNumber[2].infinite? # => nil
|
64
|
+
# VectorNumber[Float::NAN].infinite? # => 1
|
65
|
+
# VectorNumber["a"].mult(-Float::INFINITY).infinite? # => 1
|
66
|
+
#
|
37
67
|
# @return [1, nil]
|
68
|
+
#
|
69
|
+
# @since 0.1.0
|
38
70
|
def infinite?
|
39
71
|
finite? ? nil : 1 # rubocop:disable Style/ReturnNilInPredicateMethodDefinition
|
40
72
|
end
|
41
73
|
|
42
74
|
# Returns +true+ if there are no non-zero coefficients, and +false+ otherwise.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# VectorNumber["c"].zero? # => false
|
78
|
+
# VectorNumber[].zero? # => true
|
79
|
+
#
|
43
80
|
# @return [Boolean]
|
44
|
-
|
45
|
-
|
46
|
-
|
81
|
+
#
|
82
|
+
# @since 0.1.0
|
83
|
+
def zero? = size.zero?
|
47
84
|
|
48
85
|
# Returns +self+ if there are any non-zero coefficients, +nil+ otherwise.
|
86
|
+
#
|
87
|
+
# This behavior is the same as +Numeric+'s.
|
88
|
+
#
|
89
|
+
# @example
|
90
|
+
# VectorNumber["ab", "cd"].nonzero? # => (1⋅'ab' + 1⋅'cd')
|
91
|
+
# VectorNumber[].nonzero? # => nil
|
92
|
+
#
|
49
93
|
# @return [VectorNumber, nil]
|
94
|
+
#
|
95
|
+
# @since 0.1.0
|
50
96
|
def nonzero?
|
51
97
|
zero? ? nil : self # rubocop:disable Style/ReturnNilInPredicateMethodDefinition
|
52
98
|
end
|
53
99
|
|
54
100
|
# Returns +true+ if number is non-zero and all non-zero coefficients are positive,
|
55
101
|
# and +false+ otherwise.
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# VectorNumber["a"].positive? # => true
|
105
|
+
# VectorNumber[2].neg.positive? # => false
|
106
|
+
# (VectorNumber["1"] - VectorNumber[1]).positive? # => false
|
107
|
+
# VectorNumber[0].positive? # => false
|
108
|
+
#
|
56
109
|
# @return [Boolean]
|
110
|
+
#
|
111
|
+
# @since 0.1.0
|
57
112
|
def positive?
|
58
113
|
!zero? && all? { |_u, c| c.positive? }
|
59
114
|
end
|
60
115
|
|
61
116
|
# Returns +true+ if number is non-zero and all non-zero coefficients are negative,
|
62
117
|
# and +false+ otherwise.
|
118
|
+
#
|
119
|
+
# @example
|
120
|
+
# VectorNumber["a"].neg.negative? # => true
|
121
|
+
# VectorNumber[-2].neg.negative? # => false
|
122
|
+
# (VectorNumber["1"] - VectorNumber[1]).negative? # => false
|
123
|
+
# VectorNumber[0].negative? # => false
|
124
|
+
#
|
63
125
|
# @return [Boolean]
|
126
|
+
#
|
127
|
+
# @since 0.1.0
|
64
128
|
def negative?
|
65
129
|
!zero? && all? { |_u, c| c.negative? }
|
66
130
|
end
|
67
131
|
|
68
|
-
# Always returns +false+, as vectors are
|
132
|
+
# Always returns +false+, as vectors are not real numbers.
|
133
|
+
#
|
134
|
+
# This behavior is the same as +Complex+'s.
|
135
|
+
#
|
69
136
|
# @see #numeric?
|
137
|
+
#
|
70
138
|
# @return [false]
|
71
|
-
|
72
|
-
|
73
|
-
|
139
|
+
#
|
140
|
+
# @since 0.1.0
|
141
|
+
def real? = false
|
74
142
|
|
75
143
|
# Always returns +false+, as vectors are not +Integer+s.
|
144
|
+
#
|
76
145
|
# @return [false]
|
77
|
-
|
78
|
-
|
79
|
-
|
146
|
+
#
|
147
|
+
# @since 0.2.1
|
148
|
+
def integer? = false
|
80
149
|
end
|
81
150
|
end
|
@@ -4,21 +4,37 @@ class VectorNumber
|
|
4
4
|
# Methods and options for string representation.
|
5
5
|
module Stringifying
|
6
6
|
# Predefined symbols for multiplication to display between unit and coefficient.
|
7
|
+
#
|
7
8
|
# @return [Hash{Symbol => String}]
|
9
|
+
#
|
10
|
+
# @since 0.1.0
|
8
11
|
MULT_STRINGS = {
|
9
12
|
asterisk: "*", # U+002A
|
10
13
|
cross: "×", # U+00D7
|
11
14
|
dot: "⋅", # U+22C5
|
12
15
|
invisible: "", # U+2062, zero-width multiplication operator
|
13
16
|
space: " ",
|
14
|
-
none: ""
|
17
|
+
none: "",
|
15
18
|
}.freeze
|
16
19
|
|
20
|
+
# Get a string representation of the vector.
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# VectorNumber[5, "s"].to_s # => "5 + 1⋅'s'"
|
24
|
+
# VectorNumber["s", 5].to_s # => "1⋅'s' + 5"
|
25
|
+
# @example with :mult argument
|
26
|
+
# VectorNumber[5, "s"].to_s(mult: :asterisk) # => "5 + 1*'s'"
|
27
|
+
# @example :mult option specified for the vector
|
28
|
+
# VectorNumber[5, "s", mult: :none].to_s # => "5 + 1's'"
|
29
|
+
#
|
17
30
|
# @param mult [Symbol, String]
|
18
31
|
# text to use between coefficient and unit,
|
19
32
|
# can be one of the keys in {MULT_STRINGS} or an arbitrary string
|
20
33
|
# @return [String]
|
21
|
-
# @raise [ArgumentError]
|
34
|
+
# @raise [ArgumentError]
|
35
|
+
# if +mult+ is not a String and is not in {MULT_STRINGS}'s keys
|
36
|
+
#
|
37
|
+
# @since 0.1.0
|
22
38
|
def to_s(mult: options[:mult])
|
23
39
|
return "0" if zero?
|
24
40
|
|
@@ -34,8 +50,20 @@ class VectorNumber
|
|
34
50
|
result
|
35
51
|
end
|
36
52
|
|
53
|
+
# Get a string representation of the vector.
|
54
|
+
#
|
55
|
+
# This is similar to +Complex#inspect+: it returns result of {#to_s} in round brackets.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# VectorNumber[5, "s"].inspect # => "(5 + 1⋅'s')"
|
59
|
+
#
|
37
60
|
# @return [String]
|
61
|
+
#
|
62
|
+
# @see to_s
|
63
|
+
#
|
64
|
+
# @since 0.1.0
|
38
65
|
def inspect
|
66
|
+
# TODO: Probably make this independent of options.
|
39
67
|
"(#{self})"
|
40
68
|
end
|
41
69
|
|
@@ -46,6 +74,8 @@ class VectorNumber
|
|
46
74
|
# @param mult [Symbol, String]
|
47
75
|
# @return [String]
|
48
76
|
# @raise [ArgumentError] if +mult+ is not in {MULT_STRINGS}'s keys
|
77
|
+
#
|
78
|
+
# @since 0.1.0
|
49
79
|
def value_to_s(unit, coefficient, mult:)
|
50
80
|
if !mult.is_a?(String) && !MULT_STRINGS.key?(mult)
|
51
81
|
raise ArgumentError, "unknown key #{mult.inspect}", caller
|
data/lib/vector_number.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "vector_number/
|
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/
|
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,53 +19,96 @@ 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
|
-
#
|
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]
|
45
|
-
# VectorNumber[[1, 2, 3]]
|
46
|
-
# VectorNumber[
|
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}]
|
57
|
-
# options for this number, if +values+ is a VectorNumber,
|
58
|
-
# these will be merged with options from +
|
103
|
+
# options for this number, if +values+ is a VectorNumber or contains it,
|
104
|
+
# these will be merged with options from its +options+
|
59
105
|
# @option options [Symbol, String] :mult
|
60
106
|
# text to use between unit and coefficient, see {Stringifying#to_s} for explanation
|
61
107
|
# @yieldparam coefficient [Integer, Float, Rational, BigDecimal]
|
62
108
|
# @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
|
63
109
|
# @raise [RangeError] if any pesky non-reals get where they shouldn't
|
64
|
-
def initialize(values = nil, options =
|
65
|
-
#
|
66
|
-
# > (VectorNumber[1, 'a', mult: :invisible] + 2).options
|
67
|
-
# => {:mult=>:dot}
|
68
|
-
super()
|
110
|
+
def initialize(values = nil, options = nil, &)
|
111
|
+
# @type var options: Hash[Symbol, Object]
|
69
112
|
initialize_from(values)
|
70
113
|
apply_transform(&)
|
71
114
|
finalize_contents
|
@@ -78,15 +121,18 @@ class VectorNumber
|
|
78
121
|
# Return self.
|
79
122
|
#
|
80
123
|
# @return [VectorNumber]
|
81
|
-
|
82
|
-
|
83
|
-
|
124
|
+
#
|
125
|
+
# @since 0.2.0
|
126
|
+
def +@ = self
|
127
|
+
# @since 0.2.4
|
128
|
+
alias dup +@
|
84
129
|
|
85
130
|
# Return self.
|
86
131
|
#
|
87
|
-
# Raises ArgumentError if +freeze+ is not +true+ or +nil+.
|
88
|
-
#
|
89
132
|
# @return [VectorNumber]
|
133
|
+
# @raise [ArgumentError] if +freeze+ is not +true+ or +nil+.
|
134
|
+
#
|
135
|
+
# @since 0.2.4
|
90
136
|
def clone(freeze: true)
|
91
137
|
case freeze
|
92
138
|
when true, nil
|
@@ -101,22 +147,31 @@ class VectorNumber
|
|
101
147
|
private
|
102
148
|
|
103
149
|
# Create new VectorNumber from a value or self, optionally applying a transform.
|
150
|
+
#
|
104
151
|
# @param from [Object] self if not specified
|
105
152
|
# @yieldparam coefficient [Integer, Float, Rational, BigDecimal]
|
106
153
|
# @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
|
107
154
|
# @return [VectorNumber]
|
108
155
|
def new(from = self, &)
|
109
|
-
self.class.new(from, &)
|
156
|
+
self.class.new(from, options, &)
|
110
157
|
end
|
111
158
|
|
159
|
+
# Check if +other+ is a real number.
|
160
|
+
#
|
161
|
+
# Currently this is either a +real?+ Numeric or +numeric?(1)+ VectorNumber.
|
162
|
+
#
|
112
163
|
# @param value [Object]
|
113
164
|
# @return [Boolean]
|
165
|
+
#
|
166
|
+
# @since 0.1.0
|
114
167
|
def real_number?(value)
|
115
168
|
(value.is_a?(Numeric) && value.real?) || (value.is_a?(self.class) && value.numeric?(1))
|
116
169
|
end
|
117
170
|
|
118
171
|
# @param values [Array, Hash{Object => Integer, Float, Rational, BigDecimal}, VectorNumber, nil]
|
119
172
|
# @return [void]
|
173
|
+
#
|
174
|
+
# @since 0.1.0
|
120
175
|
def initialize_from(values)
|
121
176
|
@data = Hash.new(0)
|
122
177
|
|
@@ -132,6 +187,8 @@ class VectorNumber
|
|
132
187
|
|
133
188
|
# @param value [VectorNumber, Numeric, Object]
|
134
189
|
# @return [void]
|
190
|
+
#
|
191
|
+
# @since 0.1.0
|
135
192
|
def add_value_to_data(value)
|
136
193
|
case value
|
137
194
|
when Numeric
|
@@ -145,6 +202,8 @@ class VectorNumber
|
|
145
202
|
|
146
203
|
# @param value [Numeric]
|
147
204
|
# @return [void]
|
205
|
+
#
|
206
|
+
# @since 0.1.0
|
148
207
|
def add_numeric_value_to_data(value)
|
149
208
|
@data[R] += value.real
|
150
209
|
@data[I] += value.imaginary
|
@@ -152,6 +211,8 @@ class VectorNumber
|
|
152
211
|
|
153
212
|
# @param vector [VectorNumber, Hash{Object => Integer, Float, Rational, BigDecimal}]
|
154
213
|
# @return [void]
|
214
|
+
#
|
215
|
+
# @since 0.1.0
|
155
216
|
def add_vector_to_data(vector)
|
156
217
|
vector.each_pair do |unit, coefficient|
|
157
218
|
raise RangeError, "#{coefficient} is not a real number" unless real_number?(coefficient)
|
@@ -164,6 +225,8 @@ class VectorNumber
|
|
164
225
|
# @yieldreturn [Integer, Float, Rational, BigDecimal]
|
165
226
|
# @return [void]
|
166
227
|
# @raise [RangeError]
|
228
|
+
#
|
229
|
+
# @since 0.1.0
|
167
230
|
def apply_transform
|
168
231
|
return unless block_given?
|
169
232
|
|
@@ -178,32 +241,54 @@ class VectorNumber
|
|
178
241
|
# @param options [Hash{Symbol => Object}, nil]
|
179
242
|
# @param values [Object] initializing object
|
180
243
|
# @return [void]
|
244
|
+
#
|
245
|
+
# @since 0.1.0
|
181
246
|
def save_options(options, values:)
|
182
247
|
@options =
|
183
248
|
case [options, values]
|
184
249
|
in [{} | nil, VectorNumber]
|
185
250
|
values.options
|
251
|
+
in [{} | nil, [*, VectorNumber => vector, *]]
|
252
|
+
vector.options
|
186
253
|
in Hash, VectorNumber
|
187
|
-
values.options
|
254
|
+
merge_options(values.options, options)
|
255
|
+
in Hash, [*, VectorNumber => vector, *]
|
256
|
+
merge_options(vector.options, options)
|
188
257
|
in Hash, _ unless options.empty?
|
189
|
-
default_options
|
258
|
+
merge_options(default_options, options)
|
190
259
|
else
|
191
260
|
default_options
|
192
261
|
end
|
193
262
|
end
|
194
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
|
269
|
+
def merge_options(base_options, added_options)
|
270
|
+
# Optimization for the common case of passing options through #new.
|
271
|
+
return base_options if added_options.equal?(base_options)
|
272
|
+
|
273
|
+
base_options.merge(added_options).slice(*known_options)
|
274
|
+
end
|
275
|
+
|
195
276
|
# Compact coefficients, calculate size and freeze data.
|
196
277
|
# @return [void]
|
278
|
+
#
|
279
|
+
# @since 0.1.0
|
197
280
|
def finalize_contents
|
198
281
|
@data.delete_if { |_u, c| c.zero? }
|
199
282
|
@data.freeze
|
200
283
|
@size = @data.size
|
201
284
|
end
|
202
285
|
|
286
|
+
# @since 0.2.0
|
203
287
|
def default_options
|
204
288
|
DEFAULT_OPTIONS
|
205
289
|
end
|
206
290
|
|
291
|
+
# @since 0.2.0
|
207
292
|
def known_options
|
208
293
|
KNOWN_OPTIONS
|
209
294
|
end
|
data/sig/vector_number.rbs
CHANGED
@@ -51,11 +51,12 @@ class VectorNumber
|
|
51
51
|
def self.[]: (*unit_type values, **options_type options) -> vector_type
|
52
52
|
|
53
53
|
def initialize:
|
54
|
-
(?(units_list_type | plain_vector_type | vector_type)? values, ?options_type options)
|
54
|
+
(?(units_list_type | plain_vector_type | vector_type)? values, ?options_type? options)
|
55
55
|
?{ (coefficient_type coefficient) -> coefficient_type }
|
56
56
|
-> void
|
57
57
|
|
58
|
-
def
|
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,15 +89,17 @@ 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
|
+
alias neg -@
|
93
94
|
|
94
95
|
def +: (in_value_type) -> vector_type
|
96
|
+
alias add +
|
95
97
|
|
96
98
|
def -: (in_value_type) -> vector_type
|
99
|
+
alias sub -
|
97
100
|
|
98
101
|
def *: (real_number | vector_type) -> vector_type
|
102
|
+
alias mult *
|
99
103
|
|
100
104
|
def /: (real_number | vector_type) -> vector_type
|
101
105
|
alias quo /
|
@@ -130,6 +134,8 @@ class VectorNumber
|
|
130
134
|
def ceil: (Integer) -> vector_type
|
131
135
|
|
132
136
|
def floor: (Integer) -> vector_type
|
137
|
+
|
138
|
+
def round: (Integer, ?half: (:up | :down | :even)) -> vector_type
|
133
139
|
end
|
134
140
|
|
135
141
|
# Methods for converting to different number classes.
|
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.
|
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:
|
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
|
-
|
37
|
-
|
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.
|
61
|
+
rubygems_version: 3.6.8
|
56
62
|
specification_version: 4
|
57
63
|
summary: A library to add together anything.
|
58
64
|
test_files: []
|