36 lines
974 B
Go
36 lines
974 B
Go
package types
|
|
|
|
// Codespacer is a simple struct to track reserved codespaces
|
|
type Codespacer struct {
|
|
reserved map[CodespaceType]bool
|
|
}
|
|
|
|
// NewCodespacer generates a new Codespacer with the starting codespace
|
|
func NewCodespacer() *Codespacer {
|
|
return &Codespacer{
|
|
reserved: make(map[CodespaceType]bool),
|
|
}
|
|
}
|
|
|
|
// RegisterNext reserves and returns the next available codespace, starting from a default, and panics if the maximum codespace is reached
|
|
func (c *Codespacer) RegisterNext(codespace CodespaceType) CodespaceType {
|
|
for {
|
|
if !c.reserved[codespace] {
|
|
c.reserved[codespace] = true
|
|
return codespace
|
|
}
|
|
codespace++
|
|
if codespace == MaximumCodespace {
|
|
panic("Maximum codespace reached!")
|
|
}
|
|
}
|
|
}
|
|
|
|
// RegisterOrPanic reserved a codespace or panics if it is unavailable
|
|
func (c *Codespacer) RegisterOrPanic(codespace CodespaceType) {
|
|
if c.reserved[codespace] {
|
|
panic("Cannot register codespace, already reserved")
|
|
}
|
|
c.reserved[codespace] = true
|
|
}
|