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