Implemented token splitting as a generator
This commit is contained in:
parent
3ffcfa0084
commit
f31ea5e825
4 changed files with 39 additions and 60 deletions
|
@ -30,9 +30,9 @@ func (list List) LastIndexKind(kind Kind) int {
|
|||
}
|
||||
|
||||
// Split calls the callback function on each set of tokens in a comma separated list.
|
||||
func (list List) Split(call func(List) error) error {
|
||||
func (list List) Split(yield func(List) bool) {
|
||||
if len(list) == 0 {
|
||||
return nil
|
||||
return
|
||||
}
|
||||
|
||||
start := 0
|
||||
|
@ -52,18 +52,16 @@ func (list List) Split(call func(List) error) error {
|
|||
}
|
||||
|
||||
parameter := list[start:i]
|
||||
err := call(parameter)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
if !yield(parameter) {
|
||||
return
|
||||
}
|
||||
|
||||
start = i + 1
|
||||
}
|
||||
}
|
||||
|
||||
parameter := list[start:]
|
||||
return call(parameter)
|
||||
yield(list[start:])
|
||||
}
|
||||
|
||||
// Text returns the concatenated token text.
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package token_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"git.urbach.dev/cli/q/src/token"
|
||||
|
@ -23,35 +22,28 @@ func TestSplit(t *testing.T) {
|
|||
tokens := token.Tokenize(src)
|
||||
parameters := []string{}
|
||||
|
||||
err := tokens.Split(func(parameter token.List) error {
|
||||
parameters = append(parameters, parameter.Text(src))
|
||||
return nil
|
||||
})
|
||||
for param := range tokens.Split {
|
||||
parameters = append(parameters, param.Text(src))
|
||||
}
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.DeepEqual(t, parameters, []string{"1+2", "3*4", "5*6", "7+8"})
|
||||
}
|
||||
|
||||
func TestSplitBreak(t *testing.T) {
|
||||
src := []byte("1,2")
|
||||
tokens := token.Tokenize(src)
|
||||
|
||||
for range tokens.Split {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitEmpty(t *testing.T) {
|
||||
tokens := token.List{}
|
||||
|
||||
err := tokens.Split(func(parameter token.List) error {
|
||||
return errors.New("error")
|
||||
})
|
||||
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestSplitError(t *testing.T) {
|
||||
src := []byte("1,2,3")
|
||||
tokens := token.Tokenize(src)
|
||||
|
||||
err := tokens.Split(func(parameter token.List) error {
|
||||
return errors.New("error")
|
||||
})
|
||||
|
||||
assert.NotNil(t, err)
|
||||
assert.Equal(t, err.Error(), "error")
|
||||
for range tokens.Split {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitGroups(t *testing.T) {
|
||||
|
@ -59,12 +51,10 @@ func TestSplitGroups(t *testing.T) {
|
|||
tokens := token.Tokenize(src)
|
||||
parameters := []string{}
|
||||
|
||||
err := tokens.Split(func(parameter token.List) error {
|
||||
parameters = append(parameters, parameter.Text(src))
|
||||
return nil
|
||||
})
|
||||
for param := range tokens.Split {
|
||||
parameters = append(parameters, param.Text(src))
|
||||
}
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.DeepEqual(t, parameters, []string{"f(1,2)", "g(3,4)"})
|
||||
}
|
||||
|
||||
|
@ -73,11 +63,9 @@ func TestSplitSingle(t *testing.T) {
|
|||
tokens := token.Tokenize(src)
|
||||
parameters := []string{}
|
||||
|
||||
err := tokens.Split(func(parameter token.List) error {
|
||||
parameters = append(parameters, parameter.Text(src))
|
||||
return nil
|
||||
})
|
||||
for param := range tokens.Split {
|
||||
parameters = append(parameters, param.Text(src))
|
||||
}
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.DeepEqual(t, parameters, []string{"123"})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue