type Edit … func (e Edit) String() string { … } // Apply applies a sequence of edits to the src buffer and returns the // result. Edits are applied in order of start offset; edits with the // same start offset are applied in they order they were provided. // // Apply returns an error if any edit is out of bounds, // or if any pair of edits is overlapping. func Apply(src string, edits []Edit) (string, error) { … } // ApplyBytes is like Apply, but it accepts a byte slice. // The result is always a new array. func ApplyBytes(src []byte, edits []Edit) ([]byte, error) { … } // validate checks that edits are consistent with src, // and returns the size of the patched output. // It may return a different slice. func validate(src string, edits []Edit) ([]Edit, int, error) { … } // SortEdits orders a slice of Edits by (start, end) offset. // This ordering puts insertions (end = start) before deletions // (end > start) at the same point, but uses a stable sort to preserve // the order of multiple insertions at the same point. // (Apply detects multiple deletions at the same point as an error.) func SortEdits(edits []Edit) { … } type editsSort … func (a editsSort) Len() int { … } func (a editsSort) Less(i, j int) bool { … } func (a editsSort) Swap(i, j int) { … } // lineEdits expands and merges a sequence of edits so that each // resulting edit replaces one or more complete lines. // See ApplyEdits for preconditions. func lineEdits(src string, edits []Edit) ([]Edit, error) { … } // expandEdit returns edit expanded to complete whole lines. func expandEdit(edit Edit, src string) Edit { … }