func main() {
	rand.Seed(time.Now().UTC().UnixNano())

	var list cslib.List

	// 1. Insert 10 integers and print them out in order.
	fmt.Println("Exercise 1:")

	list = &cslib.LinkedList{}
	for i := 0; i < 10; i++ {
		list.Append(i)
	}
	list.Traverse(func(x int) { fmt.Printf("%d ", x) })
	fmt.Println()

	// The remaining exercises we run for a variety of different list types.

	// 2. For n = 100, ..., X, time the following operations:
	fmt.Println("\nExercise 2:")
	for i := 2; i <= 5; i++ {
		// Size of list.
		n := int(math.Pow(10, float64(i)))
		fmt.Printf("n = %d\n", n)

		list = &cslib.LinkedList{}
		testList("LinkedList", n, list)

		list = &cslib.ArrayList{Growth: 1.1}
		testList("ArrayList(1.1)", n, list)

		list = &cslib.ArrayList{Growth: 1.5}
		testList("ArrayList(1.5)", n, list)

		list = &cslib.ArrayList{Growth: 2.0}
		testList("ArrayList(2.0)", n, list)
	}
}
func testList(listType string, n int, list cslib.List) {
	// a. Append n integers.
	timeFunc(fmt.Sprintf("%s Append", listType), func() {
		for j := 0; j < n; j++ {
			list.Append(j)
		}
	})

	// b. Get a random index 10000 times.
	timeFunc(fmt.Sprintf("%s Get 10K", listType), func() {
		for j := 0; j < 10000; j++ {
			list.Get(rand.Intn(list.Length()))
		}
	})

	// c. Remove all elements from the front of the list.
	timeFunc(fmt.Sprintf("%s Remove", listType), func() {
		for list.Length() > 0 {
			list.Remove(0)
		}
	})

	fmt.Println()
}