// Copyright 2020 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 tinferenceB

import "strconv"

type any interface{}

func f0[A any, B interface{type C}, C interface{type D}, D interface{type A}](A, B, C, D)
func _() {
	f := f0[string]
	f("a", "b", "c", "d")
	f0("a", "b", "c", "d")
}

func f1[A any, B interface{type A}](A, B)
func _() {
	f := f1[int]
	f(int(0), int(0))
	f1(int(0), int(0))
}

func f2[A any, B interface{type []A}](A, B)
func _() {
	f := f2[byte]
	f(byte(0), []byte{})
	f2(byte(0), []byte{})
}

func f3[A any, B interface{type C}, C interface{type *A}](A, B, C)
func _() {
	f := f3[int]
	var x int
	f(x, &x, &x)
	f3(x, &x, &x)
}

func f4[A any, B interface{type []C}, C interface{type *A}](A, B, C)
func _() {
	f := f4[int]
	var x int
	f(x, []*int{}, &x)
	f4(x, []*int{}, &x)
}

func f5[A interface{type struct{b B; c C}}, B any, C interface{type *B}](x B) A
func _() {
	x := f5(1.2)
	var _ float64 = x.b
	var _ float64 = *x.c
}

func f6[A any, B interface{type struct{f []A}}](B) A
func _() {
	x := f6(struct{f []string}{})
	var _ string = x
}

// TODO(gri) Need to flag invalid recursive constraints. At the
// moment these cause infinite recursions and stack overflow.
// func f7[A interface{type B}, B interface{type A}]()

// More realistic examples

func Double[S interface{ type []E }, E interface{ type int, int8, int16, int32, int64 }](s S) S {
	r := make(S, len(s))
	for i, v := range s {
		r[i] = v + v
	}
	return r
}

type MySlice []int

var _ = Double(MySlice{1})

// From the draft design.

type Setter[B any] interface {
	Set(string)
	type *B
}

func FromStrings[T interface{}, PT Setter[T]](s []string) []T {
	result := make([]T, len(s))
	for i, v := range s {
		// The type of &result[i] is *T which is in the type list
		// of Setter2, so we can convert it to PT.
		p := PT(&result[i])
		// PT has a Set method.
		p.Set(v)
	}
	return result
}

type Settable int

func (p *Settable) Set(s string) {
	i, _ := strconv.Atoi(s) // real code should not ignore the error
	*p = Settable(i)
}

var _ = FromStrings[Settable]([]string{"1", "2"})
