lib/dydx/algebra/operator/parts/general.rb in dydx-0.0.5 vs lib/dydx/algebra/operator/parts/general.rb in dydx-0.0.6

- old
+ new

@@ -1,39 +1,63 @@ module Dydx module Algebra module Operator module Parts module General - def +(x) - if x.is_0? - self - elsif inverse?(x, :+) - e0 - else - super(x) + %w(+ * ^).map(&:to_sym).each do |operator| + define_method(operator) do |x| + if x.is_0? + case operator + when :+ then self + when :* then x + when :^ then e1 + end + elsif x.is_1? + case operator + when :+ then super(x) + when :* then self + when :^ then self + end + elsif self == x + case operator + when :+ then _(2) * self + when :* then self ^ _(2) + when :^ then super(x) + end + elsif operator == :+ && inverse?(x, :+) + e0 + elsif operator == :* && inverse?(x, :*) + e1 + elsif [:+, :*].include?(operator) && x.send("#{to_str(operator)}?") + if combinable?(x.f, operator) + send(operator, x.f).send(operator, x.g) + elsif combinable?(x.g, operator) + send(operator, x.g).send(operator, x.f) + else + super(x) + end + elsif x.is_a?(Inverse) && x.operator == operator && x.x.send("#{to_str(operator)}?") + if combinable?(x.x.f, operator) + send(operator, inverse(x.x.f, operator)).send(operator, inverse(x.x.g, operator)) + elsif combinable?(x.x.g, operator) + send(operator, inverse(x.x.g, operator)).send(operator, inverse(x.x.f, operator)) + else + super(x) + end + elsif [:*].include?(operator) && x.subtrahend? + inverse(::Algebra::Formula.new(self, x.x, operator.to_sym), :+) + else + super(x) + end end end - def *(x) - if x.is_0? - x - elsif x.is_1? - self - elsif inverse?(x, :*) - e1 - else - super(x) - end - end - - def ^(x) - if x.is_0? - _(1) - elsif x.is_1? - self - else - super(x) - end + def to_str(operator) + { + addition: :+, + multiplication: :*, + exponentiation: :^ + }.key(operator) end end end end end