// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
// For more tutorials  : https://learngoprogramming.com
// In-person training  : https://www.linkedin.com/in/inancgumus/
// Follow me on twitter: https://twitter.com/inancgumus

package main

import (
	"fmt"
	"sort"
)

func main() {
	l := list{
		{title: "moby dick", price: 10, released: toTimestamp(118281600)},
		{title: "odyssey", price: 15, released: toTimestamp("733622400")},
		{title: "hobbit", price: 25},
	}

	sort.Sort(l)
	sort.Sort(sort.Reverse(l))
	sort.Sort(byReleaseDate(l))
	sort.Sort(sort.Reverse(byReleaseDate(l)))

	fmt.Print(l)
}

/*
Summary:

- sort.Sort() can sort any type that implements the sort.Interface

- sort.Interface has three methods: Len(), Less(), Swap()
  - Len() returns the length of a collection.
  - Less(i, j) should return true when an element comes before another one.
  - Swap(i, j)s the elements when Less() returns true.

- sort.Reverse() can reverse sort a type that satisfies the sort.Interface.

- You can customize the sorting:
  - Either by implementing the sort.Interface methods,
  - or by anonymously embedding a type that already satisfies the sort.Interface
  - and adding a Less() method.

- Anonymous embedding means auto-forwarding method calls to an embedded value.
*/
