nelson 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/lib/nelson/version.rb +1 -1
- data/lib/nelson.rb +93 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe237670123049b19a549ca9fbb13e9e3a8ad7dd
|
4
|
+
data.tar.gz: f306e36af7f6d2c5cebabc1726fa92e53eae712e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95d5a5da40ff327ff1ee006b764e0375de747e947bdeddee81b10ccd358e90566478eab1ad71125a00d1b4dab2a31598babf87b3a48d57258aa72b827087185f
|
7
|
+
data.tar.gz: 1b9e0f1ecf82f66514d483dbe89a1d3a89f1ab38db584d39efcdf92cbbbbef8a46a0bf4ed3c6b896f1682da011edeea545f1c9730d172e1323e8c8fb3c4c1962
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Nelson
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/nelson.svg)](http://badge.fury.io/rb/nelson)
|
2
3
|
|
3
|
-
A library for building, manipulating, displaying, and
|
4
|
+
A library for building, manipulating, displaying, and solving math expressions using a fluent API.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
data/lib/nelson/version.rb
CHANGED
data/lib/nelson.rb
CHANGED
@@ -1,5 +1,97 @@
|
|
1
1
|
require "nelson/version"
|
2
2
|
|
3
3
|
module Nelson
|
4
|
-
|
4
|
+
def self.product_of(*terms)
|
5
|
+
MultipicationExpressionBuilder.new(*terms)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.sum_of(*terms)
|
9
|
+
AdditionExpressionBuilder.new(*terms)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
class Expression
|
14
|
+
attr_accessor :terms
|
15
|
+
|
16
|
+
def initialize(*terms)
|
17
|
+
@terms = terms
|
18
|
+
end
|
19
|
+
|
20
|
+
def *(term)
|
21
|
+
rhs_value = self.call
|
22
|
+
lhs_value = term.respond_to?(:call) ? term.call : term
|
23
|
+
MultipicationExpression.new(rhs_value, lhs_value).call
|
24
|
+
end
|
25
|
+
|
26
|
+
def +(term)
|
27
|
+
rhs_value = self.call
|
28
|
+
lhs_value = term.respond_to?(:call) ? term.call : term
|
29
|
+
AdditionExpression.new(rhs_value, lhs_value).call
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ExpressionBuilder
|
34
|
+
attr_accessor :terms
|
35
|
+
|
36
|
+
def initialize(*terms)
|
37
|
+
@terms = terms
|
38
|
+
end
|
39
|
+
|
40
|
+
def and(term)
|
41
|
+
terms << term
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
|
45
|
+
def times(term)
|
46
|
+
MultipicationExpressionBuilder.new(self, term)
|
47
|
+
end
|
48
|
+
|
49
|
+
def plus(term)
|
50
|
+
AdditionExpressionBuilder.new(self, term)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class MultipicationExpression < Expression
|
55
|
+
def call
|
56
|
+
terms.reduce(:*)
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
terms.sort_by { |t| t.is_a?(Expression) ? 1 : 0 }.reduce("") do |c, t|
|
61
|
+
case t
|
62
|
+
when Expression
|
63
|
+
c << "(#{t})"
|
64
|
+
else
|
65
|
+
c = [c, t].map(&:to_s).reject(&:empty?).join("*")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class MultipicationExpressionBuilder < ExpressionBuilder
|
72
|
+
def build
|
73
|
+
terms.map! { |e| e.is_a?(ExpressionBuilder) ? e.build : e }
|
74
|
+
MultipicationExpression.new(*terms)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class AdditionExpression < Expression
|
79
|
+
def call
|
80
|
+
terms.reduce(:+)
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def to_s
|
85
|
+
terms.map do |t|
|
86
|
+
t.is_a?(Expression) ? "(#{t})" : t
|
87
|
+
end.join("+")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class AdditionExpressionBuilder < ExpressionBuilder
|
92
|
+
def build
|
93
|
+
terms.map! { |e| e.is_a?(ExpressionBuilder) ? e.build : e }
|
94
|
+
AdditionExpression.new(*terms)
|
95
|
+
end
|
96
|
+
end
|
5
97
|
end
|