ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# hendrikniemann's solution

## to Bracket Push in the PureScript Track

Published at Jul 13 2018 · 0 comments
Instructions
Test suite
Solution

Given a string containing brackets [], braces {} and parentheses (), verify that all the pairs are matched and nested correctly.

Ginna Baker

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### Main.purs

module Test.Main where

import Prelude

import Effect (Effect)
import Test.Unit.Assert as Assert
import Test.Unit (TestSuite, suite, test)
import Test.Unit.Main (runTest)
import BracketPush (isPaired)

main :: Effect Unit
main = runTest suites

suites :: TestSuite
suites = do
suite "BracketPush.isPaired" do

test "paired square brackets" $Assert.equal true (isPaired "[]") test "empty string"$
Assert.equal true
(isPaired "")

test "unpaired brackets" $Assert.equal false (isPaired "[[") test "wrong ordered brackets"$
Assert.equal false
(isPaired "}{")

test "paired with whitespace" $Assert.equal true (isPaired "{ }") test "simple nested brackets"$
Assert.equal true
(isPaired "{[]}")

test "several paired brackets" $Assert.equal true (isPaired "{}[]") test "paired and nested brackets"$
Assert.equal true
(isPaired "([{}({}[])])")

test "unopened closing brackets" $Assert.equal false (isPaired "{[)][]}") test "unpaired and nested brackets"$
Assert.equal false
(isPaired "([{])")

test "paired and wrong nested brackets" $Assert.equal false (isPaired "[({]})") test "math expression"$
Assert.equal true
(isPaired "(((185 + 223.85) * 15) - 543)/2")

test "complex latex expression" \$
Assert.equal true
(isPaired "\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)")
module BracketPush
( isPaired
) where

import Prelude

import Data.List (List(..), (:))
import Data.Maybe (Maybe(..))
import Data.String (uncons)
import Data.String.Regex (replace)
import Data.String.Regex.Flags (global)
import Data.String.Regex.Unsafe (unsafeRegex)

isOpen :: Char -> Boolean
isOpen c = c == '(' || c == '[' || c == '{'

matches :: Char -> Char -> Boolean
matches '(' ')' = true
matches '[' ']' = true
matches '{' '}' = true
matches _   _   = false

onlyBrackets :: String -> String
onlyBrackets = replace (unsafeRegex "[^()[\\]{}]" global) ""

isPaired :: String -> Boolean
isPaired = onlyBrackets >>> isPaired' Nil
where
isPaired' :: List Char -> String -> Boolean
isPaired' Nil   ""  = true
isPaired' stack str = case uncons str of
Nothing -> false
Just { head, tail } ->
-- open brackets get pushed to stack
-- closed brackets need to match the stack head
else case stack of
Nil -> false
Cons x xs -> matches x head && isPaired' xs tail