sexp/input.go
2025-05-25 02:35:11 -03:00

69 lines
1 KiB
Go

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 {
v := in.input[in.index]
in.index++
return v
}
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
}
}