78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package field
|
|
|
|
import "slices"
|
|
|
|
type Notes struct {
|
|
numbers []int
|
|
}
|
|
|
|
func (n *Notes) Add(f *Field, cell *Cell, note int, trigger string, marks []Mark) error {
|
|
if n == nil || cell == nil || cell.notes != n {
|
|
return ErrInvalidCell
|
|
}
|
|
return f.AddChange(&ExternalChange{Cell: cell, Marks: marks, Action: ActionSetNote, Value: note, TriggerdBy: trigger})
|
|
}
|
|
|
|
func (n *Notes) Remove(f *Field, cell *Cell, note int, trigger string, marks []Mark) error {
|
|
if n == nil || cell == nil || cell.notes != n {
|
|
return ErrInvalidCell
|
|
}
|
|
return f.AddChange(&ExternalChange{Cell: cell, Marks: marks, Action: ActionRemoveNote, From: note, TriggerdBy: trigger})
|
|
}
|
|
|
|
func (n *Notes) Get() []int {
|
|
if n == nil {
|
|
return nil
|
|
}
|
|
return slices.Clone(n.numbers)
|
|
}
|
|
|
|
func (n *Notes) Has(number int) bool {
|
|
return n != nil && slices.Contains(n.numbers, number)
|
|
}
|
|
|
|
type Cell struct {
|
|
number int
|
|
notes *Notes
|
|
pos *Position
|
|
}
|
|
|
|
func NewCell(number int, pos *Position) *Cell {
|
|
return &Cell{number: number, notes: &Notes{}, pos: pos}
|
|
}
|
|
|
|
func (c *Cell) SetNumber(f *Field, number int, trigger string, marks []Mark) error {
|
|
if c == nil {
|
|
return ErrInvalidCell
|
|
}
|
|
return f.AddChange(&ExternalChange{Cell: c, Marks: marks, Action: ActionSetNumber, Value: number, From: c.number, TriggerdBy: trigger})
|
|
}
|
|
|
|
func (c *Cell) RemoveNumber(f *Field, trigger string, marks []Mark) error {
|
|
if c == nil {
|
|
return ErrInvalidCell
|
|
}
|
|
return f.AddChange(&ExternalChange{Cell: c, Marks: marks, Action: ActionRemoveNumber, From: c.number, TriggerdBy: trigger})
|
|
}
|
|
|
|
func (c *Cell) GetNumber() int {
|
|
if c == nil {
|
|
return 0
|
|
}
|
|
return c.number
|
|
}
|
|
|
|
func (c *Cell) GetNotes() *Notes {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
return c.notes
|
|
}
|
|
|
|
func (c *Cell) GetPosition() *Position {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
return c.pos
|
|
}
|