Skip to content

Instantly share code, notes, and snippets.

@telendt
Last active August 29, 2015 14:21
Show Gist options
  • Save telendt/d94a765e19cdfa53ccf7 to your computer and use it in GitHub Desktop.
Save telendt/d94a765e19cdfa53ccf7 to your computer and use it in GitHub Desktop.
Iterator
package main
import (
"fmt"
"sync/atomic"
"unsafe"
)
type Iterator interface {
Next() string
}
type item struct {
value string
next *item
}
type iterator struct {
head *item
}
func (i *iterator) Next() string {
return (*item)(unsafe.Pointer(atomic.SwapUintptr(
(*uintptr)(unsafe.Pointer(&i.head)),
(uintptr)(unsafe.Pointer(i.head.next))))).value
}
func NewIterator(values []string) Iterator {
var first *item
var prev *item
var i *item
for _, v := range values {
i = &item{value: v}
if first == nil {
first = i
}
if prev != nil {
prev.next = i
}
prev = i
}
i.next = first
return &iterator{head: first}
}
func main() {
i := NewIterator([]string{"raz", "dwa", "trzy"})
fmt.Println(i.Next())
fmt.Println(i.Next())
fmt.Println(i.Next())
fmt.Println(i.Next())
fmt.Println(i.Next())
fmt.Println(i.Next())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment