package bracket_push

// Bracket makes sure that all brackets match
func Bracket(s string) (bool, error) {
	// Set up a map of matches that we care about
	matches := make(map[byte]byte)
	matches['}'] = '{'
	matches[')'] = '('
	matches[']'] = '['
	var pairs []byte
	for i := range s {
		if v, ok := matches[s[i]]; ok {
			// Found a match, it's a closing bracket
			if len(pairs) == 0 || pairs[len(pairs)-1] != v {
				return false, nil
			}
			pairs = pairs[:len(pairs)-1]
		} else {
			pairs = append(pairs, s[i])
		}
	}
	if len(pairs) > 0 {
		return false, nil
	}
	return true, nil
}