1
0
textedit/sequence.go

54 lines
986 B
Go
Raw Normal View History

2025-11-01 03:49:02 +01:00
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 {
2025-12-07 23:48:21 +01:00
si := s[i]
2025-11-01 03:49:02 +01:00
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 {
2025-12-07 23:48:21 +01:00
r := ei.ReleaseState(s[i])
2025-11-01 03:49:02 +01:00
for _, ri := range r {
2025-12-09 23:22:54 +01:00
rri, ssi := sequenceEdit(e[i+1:])(ri, s[i+1:])
2025-11-01 03:49:02 +01:00
rr = append(rr, rri...)
2025-12-09 23:22:54 +01:00
s = append(s[:i+1], ssi...)
2025-11-01 03:49:02 +01:00
}
}
return rr
}
}
func sequence(e ...Editor) Editor {
2025-12-06 00:57:43 +01:00
init := make([]any, len(e))
for i, ei := range e {
if initializer, ok := ei.(interface{ initialize() any }); ok {
init[i] = initializer.initialize()
}
}
return FuncInit(
2025-11-01 03:49:02 +01:00
sequenceEdit(e),
sequenceRelease(e),
2025-12-06 00:57:43 +01:00
init,
2025-11-01 03:49:02 +01:00
)
}