// $G $D/$F.go && $L $F.$A && ./$A.out

// 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.

package main

type Item interface
{
	Print();
}

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()
{
	i := list.head;
	for i != nil {
		i.item.Print();
		i = i.next;
	}
}

// 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()
{
	print(this.val);
}

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

	list.Print();
	print("\n");
}
