package bun

import 

func ( reflect.Value) reflect.Value {
	switch .Kind() {
	case reflect.Interface:
		return (.Elem())
	case reflect.Ptr:
		return .Elem()
	default:
		return 
	}
}

func ( reflect.Value,  []int,  func(reflect.Value)) {
	 = reflect.Indirect()
	switch .Kind() {
	case reflect.Slice:
		 := .Len()
		for  := 0;  < ; ++ {
			visitField(.Index(), , )
		}
	default:
		visitField(, , )
	}
}

func ( reflect.Value,  []int,  func(reflect.Value)) {
	 = reflect.Indirect()
	if len() > 0 {
		 = .Field([0])
		if .Kind() == reflect.Ptr && .IsNil() {
			return
		}
		walk(, [1:], )
	} else {
		()
	}
}

func ( reflect.Type,  []int) reflect.Type {
	for ,  := range  {
		switch .Kind() {
		case reflect.Ptr:
			 = .Elem()
		case reflect.Slice:
			 = indirectType(.Elem())
		}
		 = .Field().Type
	}
	return indirectType()
}

func ( reflect.Type) reflect.Type {
	if .Kind() == reflect.Ptr {
		 = .Elem()
	}
	return 
}

func ( reflect.Value) reflect.Type {
	 := .Type().Elem()
	if .Kind() == reflect.Interface && .Len() > 0 {
		return indirect(.Index(0).Elem()).Type()
	}
	return indirectType()
}

func ( reflect.Value) func() reflect.Value {
	if .Kind() == reflect.Array {
		var  int
		return func() reflect.Value {
			 := .Index()
			++
			return 
		}
	}

	 := .Type()
	 := .Elem()

	if .Kind() == reflect.Ptr {
		 = .Elem()
		return func() reflect.Value {
			if .Len() < .Cap() {
				.Set(.Slice(0, .Len()+1))
				 := .Index(.Len() - 1)
				if .IsNil() {
					.Set(reflect.New())
				}
				return .Elem()
			}

			 := reflect.New()
			.Set(reflect.Append(, ))
			return .Elem()
		}
	}

	 := reflect.Zero()
	return func() reflect.Value {
		 := .Len()
		 := .Cap()

		if  <  {
			.Set(.Slice(0, +1))
			return .Index()
		}

		.Set(reflect.Append(, ))
		return .Index()
	}
}