Skip to content

Commit

Permalink
Add "sum" function
Browse files Browse the repository at this point in the history
Sum all arguments on stack.

Signed-off-by: Nathaniel Clark <Nathaniel.Clark@misrule.us>
  • Loading branch information
utopiabound committed Aug 19, 2024
1 parent e47e4bb commit 9015fbf
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/fixtures/help.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ <h1>RPN-rs is a graphical reverse polish notation (RPN) calculator</h1>
<tr><td>sqrt</td><td>1</td><td>Square root</td><td><i>./&macr;x</i></td></tr>
<tr><td>trunc(ate)</td><td>1</td><td colspan=2>Truncate value to Integer</td></tr>
<tr><td>round | rnd</td><td>1</td><td colspan=2>Round value to Integer (a half, rounds away from zero)</td></tr>
<tr><td>sum</td><td><i>all</i></td><td colspan=2>Add all values on stack togther and return sum</td></tr>
<tr><th colspan=4>Scalar Operations</th></tr>
<tr><td>factor</td><td>1</td><td colspan=2>Find all <a href="https://en.wikipedia.org/wiki/Prime_number">prime</a> factors of item</td></tr>
<tr><td>ln</td><td>1</td><td><a href="https://en.wikipedia.org/wiki/Natural_logarithm">Natural logarithm</a></td><td><i>ln(x)</i></td></tr>
Expand Down
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ fn main() {
"round" | "rnd" => stacks[0].try_unary(|a| a.try_round()),
"trunc" | "truncate" => stacks[0].try_unary(|a| a.try_trunc()),
"factor" => stacks[0].try_unary_v(|a| a.try_factor()),
"sum" => stacks[0].try_reduce(|acc, e| acc + e),
// Matrix Operations
"det" | "determinant" => stacks[0].try_unary(|a| a.try_det()),
"trans" | "transpose" => stacks[0].try_unary(|a| a.try_transpose()),
Expand Down
16 changes: 16 additions & 0 deletions src/stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pub trait StackOps {
fn try_unary_v<F: Fn(Value) -> Result<Vec<Value>, String>>(&mut self, f: F) -> Return;
fn unary_v<F: Fn(Value) -> Vec<Value>>(&mut self, f: F) -> Return;
fn binary_v<F: Fn(Value, Value) -> Vec<Value>>(&mut self, f: F) -> Return;
fn try_reduce<F: Fn(Value, Value) -> Result<Value, String>>(&mut self, f: F) -> Return;
}

impl StackOps for Vec<Value> {
Expand Down Expand Up @@ -104,4 +105,19 @@ impl StackOps for Vec<Value> {
Return::Noop
}
}
// This is roughly Iterator::try_reduce() but needs to consume self
fn try_reduce<F: Fn(Value, Value) -> Result<Value, String>>(&mut self, f: F) -> Return {
if let Some(mut acc) = self.pop() {
while let Some(e) = self.pop() {
match f(acc, e) {
Ok(c) => acc = c,
Err(e) => return Return::Err(e),
}
}
self.push(acc);
Return::Ok
} else {
Return::Noop
}
}
}

0 comments on commit 9015fbf

Please sign in to comment.