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 }