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 { 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 { r := ei.ReleaseState(s[i]) for _, ri := range r { rri, ssi := sequenceEdit(e[i+1:])(ri, s[i + 1:]) rr = append(rr, rri...) s = append(s[:i + 1], ssi...) } } return rr } } func sequence(e ...Editor) Editor { init := make([]any, len(e)) for i, ei := range e { if initializer, ok := ei.(interface{ initialize() any }); ok { init[i] = initializer.initialize() } } return FuncInit( sequenceEdit(e), sequenceRelease(e), init, ) }