26 lines
617 B
Go
26 lines
617 B
Go
package defrag
|
|
|
|
// Defrag performs an in-place sort of blocks.
|
|
// If an error occurs during processing, it will be returned. The slice may have been partially sorted.
|
|
func Defrag(blocks []byte) error {
|
|
lastPulled := len(blocks)
|
|
lastPushed := -1
|
|
for block := 0; block < len(blocks); block++ {
|
|
if blocks[block] != '.' {
|
|
continue
|
|
}
|
|
if lastPulled <= block {
|
|
break
|
|
}
|
|
for swap := lastPulled - 1; swap > lastPushed; swap-- {
|
|
if blocks[swap] == '.' {
|
|
continue
|
|
}
|
|
blocks[block], blocks[swap] = blocks[swap], blocks[block]
|
|
lastPulled = swap
|
|
lastPushed = block
|
|
break
|
|
}
|
|
}
|
|
return nil
|
|
}
|