// run

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test general operation using a list implementation.

package main

type Item interface {
	Print() string
}

type ListItem struct {
	item Item
	next *ListItem
}

type List struct {
	head *ListItem
}

func (list *List) Init() {
	list.head = nil
}

func (list *List) Insert(i Item) {
	item := new(ListItem)
	item.item = i
	item.next = list.head
	list.head = item
}

func (list *List) Print() string {
	r := ""
	i := list.head
	for i != nil {
		r += i.item.Print()
		i = i.next
	}
	return r
}

// Something to put in a list
type Integer struct {
	val int
}

func (this *Integer) Init(i int) *Integer {
	this.val = i
	return this
}

func (this *Integer) Print() string {
	return string(this.val + '0')
}

func main() {
	list := new(List)
	list.Init()
	for i := 0; i < 10; i = i + 1 {
		integer := new(Integer)
		integer.Init(i)
		list.Insert(integer)
	}

	r := list.Print()
	if r != "9876543210" {
		panic(r)
	}
}
