package main import ( "fmt" "slices" ) type Input struct { index int input []Lexeme } func (in Input) Index() int { return in.index } func (in Input) String() string { _ = in.input[in.index] return fmt.Sprintf("%v", in.input[in.index:]) } func (in *Input) Len() int { // _ = in.input[in.index] return len(in.input[in.index:]) } func (in *Input) Peek(i int) Lexeme { return in.input[in.index+i] } func (in *Input) Pop() (Lexeme, bool) { if in.index > len(in.input)-1 { return nil, false } v := in.input[in.index] in.index++ return v, true } func (in *Input) Seek(i int) { _ = in.input[i] in.index = i } func (in *Input) Take(amount int) *Input { var out = &Input{ index: 0, input: in.input[in.index : in.index+amount], } in.index += amount return out } func (in *Input) Find(open, close *Token) (int, bool) { level := 1 _ = in.input[in.index] idx := slices.IndexFunc(in.input[in.index:], func(a Lexeme) bool { switch { case a.Equals(open): level++ case a.Equals(close): level-- return level == 0 } return false }) if idx > -1 { return idx, true } else { return 0, false } }