// methodset2.go
package main

import (
	"fmt"
)

type List []int
func (l List) Len() int { return len(l) }
func (l *List) Append(val int) { *l = append(*l, val) }

type Appender interface {
        Append(int)
}

func CountInto(a Appender, start, end int) {
        for i := start; i <= end; i++ {
                a.Append(i)
        }
}

type Lener interface {
        Len() int
}

func LongEnough(l Lener) bool {
        return l.Len()*10 > 42
}

func main() {
		// A bare value
        var lst List
		// compiler error:
		// cannot use lst (type List) as type Appender in function argument:
		// List does not implement Appender (Append method requires pointer receiver)
        // CountInto(lst, 1, 10) // INVALID: Append has a pointer receiver
		
        if LongEnough(lst) {  // VALID: Identical receiver type
                fmt.Printf(" - lst is long enough")
        }

        // A pointer value
        plst := new(List)
        CountInto(plst, 1, 10) // VALID: Identical receiver type
        if LongEnough(plst) {  // VALID: a *List can be dereferenced for the receiver
                fmt.Printf(" - plst is long enough")  //  - plst is long enoug
        }      
}
