nelson 0.1.0 → 0.2.0
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/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
|
+
[](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
|