package fit
import (
"sort"
)
//First places the Item into the first Bin in which it fits.
func First(bins []Bin, capacity int64, x Item) ([]Bin, error) {
for i, b := range bins {
if !b.fits(x) {
continue
}
bins[i].add(x)
return bins, nil
}
n := newBin(capacity)
err := n.add(x)
if err != nil {
return nil, err
}
bins = append(bins, n)
return bins, nil
}
//Best places the Item into the fullest Bin it fits.
func Best(bins []Bin, capacity int64, x Item) ([]Bin, error) {
sort.Sort(sort.Reverse(BinsBySize(bins)))
for i, b := range bins {
if !b.fits(x) {
continue
}
err := bins[i].add(x)
if err != nil {
return nil, err
}
return bins, nil
}
n := newBin(capacity)
n.add(x)
bins = append(bins, n)
return bins, nil
}
//Worst places the Item into the least full Bin in which it fits.
func Worst(bins []Bin, capacity int64, x Item) ([]Bin, error) {
sort.Sort(BinsBySize(bins))
for i, b := range bins {
if !b.fits(x) {
continue
}
err := bins[i].add(x)
if err != nil {
return nil, err
}
return bins, nil
}
n := newBin(capacity)
n.add(x)
bins = append(bins, n)
return bins, nil
}
//BinSelectFunc is a strategy for placing an item into one of the bins.
//
//If required, a new bin is added with the given capacity.
type BinSelectFunc func(bins []Bin, capacity int64, item Item) ([]Bin, error)