65 lines
1002 B
Go
65 lines
1002 B
Go
|
|
package textedit
|
||
|
|
|
||
|
|
func sequenceEdit(e []Editor) func(rune, []any) ([]rune, []any) {
|
||
|
|
return func(r rune, s []any) ([]rune, []any) {
|
||
|
|
var sr []any
|
||
|
|
rr := []rune{r}
|
||
|
|
for i, ei := range e {
|
||
|
|
var si any
|
||
|
|
if len(s) > i {
|
||
|
|
si = s[i]
|
||
|
|
}
|
||
|
|
|
||
|
|
rin := rr
|
||
|
|
rr = nil
|
||
|
|
for _, ri := range rin {
|
||
|
|
var rout []rune
|
||
|
|
rout, si = ei.Edit(ri, si)
|
||
|
|
rr = append(rr, rout...)
|
||
|
|
}
|
||
|
|
|
||
|
|
sr = append(sr, si)
|
||
|
|
}
|
||
|
|
|
||
|
|
return rr, sr
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func sequenceRelease(e []Editor) func([]any) []rune {
|
||
|
|
return func(s []any) []rune {
|
||
|
|
var rr []rune
|
||
|
|
for i, ei := range e {
|
||
|
|
var r []rune
|
||
|
|
if i < len(s) {
|
||
|
|
r = ei.ReleaseState(s[i])
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, ri := range r {
|
||
|
|
var (
|
||
|
|
rri []rune
|
||
|
|
ssi []any
|
||
|
|
)
|
||
|
|
|
||
|
|
if i < len(s) {
|
||
|
|
ssi = s[i:]
|
||
|
|
}
|
||
|
|
|
||
|
|
rri, ssi = sequenceEdit(e[i+1:])(ri, ssi)
|
||
|
|
rr = append(rr, rri...)
|
||
|
|
if i < len(s) {
|
||
|
|
s = append(s[:i], ssi...)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return rr
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func sequence(e ...Editor) Editor {
|
||
|
|
return Func(
|
||
|
|
sequenceEdit(e),
|
||
|
|
sequenceRelease(e),
|
||
|
|
)
|
||
|
|
}
|