package textedit type indentState struct { started, lineStarted bool } func indentEdit(first, rest []rune) func(rune, indentState) ([]rune, indentState) { return func(r rune, s indentState) ([]rune, indentState) { if r == '\n' { s.started = true s.lineStarted = false return []rune{'\n'}, s } var ret []rune if !s.started { ret = append(ret, first...) } else if !s.lineStarted { ret = append(ret, rest...) } ret = append(ret, r) s.started = true s.lineStarted = true return ret, s } } func indent(first, rest []rune) Editor { return Func( indentEdit(first, rest), func(indentState) []rune { return nil }, ) }