1
0
textedit/sequence.go
2025-11-01 03:49:02 +01:00

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),
)
}