generic bag
This commit is contained in:
parent
cd3878d698
commit
4c42af490b
2 changed files with 16 additions and 21 deletions
|
@ -1,11 +1,6 @@
|
|||
package bag
|
||||
|
||||
// "Generic" item.
|
||||
// When type parameters will land this type became
|
||||
// type Item[T any] T
|
||||
type Item interface{}
|
||||
|
||||
type Bag interface {
|
||||
type Bag[Item any] interface {
|
||||
Add(Item)
|
||||
Size() int
|
||||
IsEmpty() bool
|
||||
|
@ -14,37 +9,37 @@ type Bag interface {
|
|||
|
||||
// We use linked list as internal data structure
|
||||
// to get O(1) speed for Add operation
|
||||
type node struct {
|
||||
type node[Item any] struct {
|
||||
item Item
|
||||
next *node
|
||||
next *node[Item]
|
||||
}
|
||||
|
||||
type bag struct {
|
||||
type bag[OfType any] struct {
|
||||
size int
|
||||
head *node
|
||||
head *node[OfType]
|
||||
}
|
||||
|
||||
func NewBag() Bag {
|
||||
return &bag{}
|
||||
func NewBag[OfType any]() Bag[OfType] {
|
||||
return &bag[OfType]{}
|
||||
}
|
||||
|
||||
func (b *bag) Add(item Item) {
|
||||
func (b *bag[OfType]) Add(item OfType) {
|
||||
next := b.head
|
||||
b.head = &node{item, next}
|
||||
b.head = &node[OfType]{item, next}
|
||||
b.size++
|
||||
}
|
||||
|
||||
func (b *bag) Size() int {
|
||||
func (b *bag[_]) Size() int {
|
||||
return b.size
|
||||
}
|
||||
|
||||
func (b *bag) IsEmpty() bool {
|
||||
func (b *bag[_]) IsEmpty() bool {
|
||||
return b.size == 0
|
||||
}
|
||||
|
||||
// As for now Go doesn't have iterators.
|
||||
// But we can simulate them with ForEach method
|
||||
func (b *bag) ForEach(f func(Item)) {
|
||||
func (b *bag[OfType]) ForEach(f func(OfType)) {
|
||||
for current := b.head; current != nil; current = current.next {
|
||||
f(current.item)
|
||||
}
|
||||
|
|
|
@ -6,14 +6,14 @@ import (
|
|||
)
|
||||
|
||||
func TestSimple(t *testing.T) {
|
||||
bag := NewBag()
|
||||
bag := NewBag[int]()
|
||||
sum := 0
|
||||
|
||||
bag.Add(1)
|
||||
bag.Add(2)
|
||||
bag.Add(3)
|
||||
|
||||
bag.ForEach(func(i Item) { sum += i.(int) })
|
||||
bag.ForEach(func(i int) { sum += i })
|
||||
|
||||
if sum != 6 {
|
||||
log.Fatal("wrong items in bag")
|
||||
|
@ -21,14 +21,14 @@ func TestSimple(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestEmpty(t *testing.T) {
|
||||
bag := NewBag()
|
||||
bag := NewBag[int]()
|
||||
sum := 0
|
||||
|
||||
if bag.Size() != 0 || !bag.IsEmpty() {
|
||||
log.Fatal("bag should be empty")
|
||||
}
|
||||
|
||||
bag.ForEach(func(i Item) { sum += i.(int) })
|
||||
bag.ForEach(func(i int) { sum += i })
|
||||
|
||||
if sum != 0 {
|
||||
log.Fatal("wrong items in bag")
|
||||
|
|
Loading…
Reference in a new issue