package soko type stateCost struct { state *State cost int distances Ints } type stateCostQueue struct { first *stateCostQueueItem } type stateCostQueueItem struct { Value *stateCost Next *stateCostQueueItem } func (q *stateCostQueue) Empty() bool { return q.first == nil } func (q *stateCostQueue) Get() *stateCost { if q.Empty() { panic("nothing in queue") } first := q.first q.first = first.Next return first.Value } func (q *stateCostQueue) Put(value *stateCost) { priority := value.cost item := &stateCostQueueItem{value, nil} if q.Empty() { q.first = item return } if priority < q.first.Value.cost { item.Next = q.first q.first = item return } curr := q.first for curr.Next != nil { if priority < curr.Next.Value.cost { item.Next = curr.Next curr.Next = item return } curr = curr.Next } curr.Next = item } func (q *stateCostQueue) Update(value *stateCost) { var prev *stateCostQueueItem curr := q.first for curr.Value != value { prev = curr curr = curr.Next if curr == nil { panic("not in queue") } } if prev == nil { q.first = curr.Next } else { prev.Next = curr.Next } q.Put(value) }