mirror of
https://gitea.elkins.co/Networking/ccl.git
synced 2025-03-09 20:51:39 -05:00
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
|
/*
|
||
|
Copyright © 2022 Joel D. Elkins <joel@elkins.co>
|
||
|
|
||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
of this software and associated documentation files (the "Software"), to deal
|
||
|
in the Software without restriction, including without limitation the rights
|
||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
copies of the Software, and to permit persons to whom the Software is
|
||
|
furnished to do so, subject to the following conditions:
|
||
|
|
||
|
The above copyright notice and this permission notice shall be included in
|
||
|
all copies or substantial portions of the Software.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
THE SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
package container
|
||
|
|
||
|
import "golang.org/x/exp/slices"
|
||
|
|
||
|
type operation bool
|
||
|
|
||
|
const (
|
||
|
Start operation = true
|
||
|
Stop operation = false
|
||
|
)
|
||
|
|
||
|
func Reorder(conts []Container, op operation) {
|
||
|
// null orderings go first for either start or stop, as they are executed asynchronously
|
||
|
norm := func(a, b Container) bool {
|
||
|
if !a.StartOrder.Valid {
|
||
|
return true
|
||
|
}
|
||
|
if !b.StartOrder.Valid {
|
||
|
return false
|
||
|
}
|
||
|
return a.StartOrder.ValueOrZero() < b.StartOrder.ValueOrZero()
|
||
|
}
|
||
|
rev := func(a, b Container) bool {
|
||
|
if !a.StartOrder.Valid {
|
||
|
return true
|
||
|
}
|
||
|
if !b.StartOrder.Valid {
|
||
|
return false
|
||
|
}
|
||
|
return b.StartOrder.ValueOrZero() > a.StartOrder.ValueOrZero()
|
||
|
}
|
||
|
var sorter func(a, b Container) bool
|
||
|
if op == Start {
|
||
|
sorter = norm
|
||
|
} else {
|
||
|
sorter = rev
|
||
|
}
|
||
|
slices.SortFunc(conts, sorter)
|
||
|
}
|