// +build ignore,OMIT

package main

import (
	"fmt"
	"sort"
)

type Weekday int

const (
	Mon Weekday = iota
	Tue
	Wed
	Thu
	Fri
	Sat
	Sun
)

var names = [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}

func (d Weekday) String() string { // ...
	return names[d]
}

// lexical START OMIT
type lexical []string

func (a lexical) Len() int           { return len(a) }
func (a lexical) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a lexical) Less(i, j int) bool { return a[i] < a[j] }

// lexical END OMIT

func main() {
	var list []string
	for d := Mon; d <= Sun; d++ {
		list = append(list, d.String())
	}

	sort.Sort(lexical(list))

	for i, x := range list {
		fmt.Println(i, x)
	}
}
