// 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{}

// TODO(rFindley) the below partially applied function types should probably
//                not be permitted (spec question).

// Embedding stand-alone type parameters is not permitted for now. Disabled.
// func f0[A any, B interface{~C}, C interface{~D}, D interface{~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{~A}](A, B)
// func _() {
// 	f := f1[int]
// 	f(int(0), int(0))
// 	f1(int(0), int(0))
// }

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

// Embedding stand-alone type parameters is not permitted for now. Disabled.
// func f3[A any, B interface{~C}, C interface{~*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{~[]C}, C interface{~*A}](A, B, C) {}
func _() {
	f := f4[int]
	var x int
	f(x, []*int{}, &x)
	f4(x, []*int{}, &x)
}

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

func f6[A any, B interface{~struct{f []A}}](B) A { panic(0) }
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{~A}]()

// More realistic examples

func Double[S interface{ ~[]E }, E interface{ ~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)
	~*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 Setter, 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"})
