Skip to content

Commit

Permalink
brackets: simplify required interface (#620)
Browse files Browse the repository at this point in the history
The Brackets struct has a single purpose: To allow `is_balanced` to be
called. It forces an object-style without any advantages over a simple
function.
  • Loading branch information
Emerentius authored and petertseng committed Aug 16, 2018
1 parent 334cdf7 commit 265896d
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 45 deletions.
6 changes: 0 additions & 6 deletions exercises/bracket-push/.meta/hints.md

This file was deleted.

8 changes: 0 additions & 8 deletions exercises/bracket-push/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@ Given a string containing brackets `[]`, braces `{}`, parentheses `()`,
or any combination thereof, verify that any and all pairs are matched
and nested correctly.

# Bracket Push in Rust

Reading about these Rust topics may help you implement a solution.

- Lifetimes and Structs: https://doc.rust-lang.org/book/second-edition/ch10-03-lifetime-syntax.html#lifetime-annotations-in-method-definitions
- From trait: https://doc.rust-lang.org/std/convert/trait.From.html


## Rust Installation

Refer to the [exercism help page][help-page] for Rust installation and learning
Expand Down
12 changes: 8 additions & 4 deletions exercises/bracket-push/example.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use std::collections::HashMap;

pub struct Brackets {
pub fn brackets_are_balanced(string: &str) -> bool {
Brackets::from(string).are_balanced()
}

struct Brackets {
raw_brackets: Vec<char>,
pairs: MatchingBrackets,
}
Expand All @@ -12,7 +16,7 @@ impl<'a> From<&'a str> for Brackets {
}

impl Brackets {
pub fn new(s: String, pairs: Option<Vec<(char, char)>>) -> Self {
fn new(s: String, pairs: Option<Vec<(char, char)>>) -> Self {
let p = match pairs {
Some(x) => MatchingBrackets::from(x),
None => MatchingBrackets::from(vec![('[', ']'), ('{', '}'), ('(', ')')]),
Expand All @@ -24,7 +28,7 @@ impl Brackets {
}
}

pub fn are_balanced(&self) -> bool {
fn are_balanced(&self) -> bool {
let mut unclosed: Vec<char> = Vec::new();

for &bracket in self.raw_brackets.iter() {
Expand All @@ -39,7 +43,7 @@ impl Brackets {
}
}

pub struct MatchingBrackets {
struct MatchingBrackets {
collection: HashMap<char, char>,
}

Expand Down
14 changes: 2 additions & 12 deletions exercises/bracket-push/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
pub struct Brackets;

impl<'a> From<&'a str> for Brackets {
fn from(input: &str) -> Self {
unimplemented!("From the '{}' input construct a new Brackets struct", input);
}
}

impl Brackets {
pub fn are_balanced(&self) -> bool {
unimplemented!("Check if your Brackets struct contains balanced brackets");
}
pub fn brackets_are_balanced(string: &str) -> bool {
unimplemented!("Check if the string \"{}\" contains balanced brackets", string);
}
30 changes: 15 additions & 15 deletions exercises/bracket-push/tests/bracket-push.rs
Original file line number Diff line number Diff line change
@@ -1,88 +1,88 @@
extern crate bracket_push;

use bracket_push::*;
use bracket_push::brackets_are_balanced;

#[test]
fn paired_square_brackets() {
assert!(Brackets::from("[]").are_balanced());
assert!(brackets_are_balanced("[]"));
}

#[test]
#[ignore]
fn empty_string() {
assert!(Brackets::from("").are_balanced());
assert!(brackets_are_balanced(""));
}

#[test]
#[ignore]
fn unpaired_brackets() {
assert!(!Brackets::from("[[").are_balanced());
assert!(!brackets_are_balanced("[["));
}

#[test]
#[ignore]
fn wrong_ordered_brackets() {
assert!(!Brackets::from("}{").are_balanced());
assert!(!brackets_are_balanced("}{"));
}

#[test]
#[ignore]
fn wrong_closing_bracket() {
assert!(!Brackets::from("{]").are_balanced());
assert!(!brackets_are_balanced("{]"));
}

#[test]
#[ignore]
fn paired_with_whitespace() {
assert!(Brackets::from("{ }").are_balanced());
assert!(brackets_are_balanced("{ }"));
}

#[test]
#[ignore]
fn simple_nested_brackets() {
assert!(Brackets::from("{[]}").are_balanced());
assert!(brackets_are_balanced("{[]}"));
}

#[test]
#[ignore]
fn several_paired_brackets() {
assert!(Brackets::from("{}[]").are_balanced());
assert!(brackets_are_balanced("{}[]"));
}

#[test]
#[ignore]
fn paired_and_nested_brackets() {
assert!(Brackets::from("([{}({}[])])").are_balanced());
assert!(brackets_are_balanced("([{}({}[])])"));
}

#[test]
#[ignore]
fn unopened_closing_brackets() {
assert!(!Brackets::from("{[)][]}").are_balanced());
assert!(!brackets_are_balanced("{[)][]}"));
}

#[test]
#[ignore]
fn unpaired_and_nested_brackets() {
assert!(!Brackets::from("([{])").are_balanced());
assert!(!brackets_are_balanced("([{])"));
}

#[test]
#[ignore]
fn paired_and_wrong_nested_brackets() {
assert!(!Brackets::from("[({]})").are_balanced());
assert!(!brackets_are_balanced("[({]})"));
}

#[test]
#[ignore]
fn math_expression() {
assert!(Brackets::from("(((185 + 223.85) * 15) - 543)/2").are_balanced());
assert!(brackets_are_balanced("(((185 + 223.85) * 15) - 543)/2"));
}

#[test]
#[ignore]
fn complex_latex_expression() {
let input = "\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \
\\end{array}\\right)";
assert!(Brackets::from(input).are_balanced());
assert!(brackets_are_balanced(input));
}

0 comments on commit 265896d

Please sign in to comment.