package bun

import (
	
	
	

	
	
)

type sliceInfo struct {
	nextElem func() reflect.Value
	scan     schema.ScannerFunc
}

type sliceModel struct {
	dest      []interface{}
	values    []reflect.Value
	scanIndex int
	info      []sliceInfo
}

var _ model = (*sliceModel)(nil)

func ( *DB,  []interface{},  []reflect.Value) *sliceModel {
	return &sliceModel{
		dest:   ,
		values: ,
	}
}

func ( *sliceModel) () interface{} {
	return .dest
}

func ( *sliceModel) ( context.Context,  *sql.Rows) (int, error) {
	,  := .Columns()
	if  != nil {
		return 0, 
	}

	.info = make([]sliceInfo, len(.values))
	for ,  := range .values {
		if .IsValid() && .Len() > 0 {
			.Set(.Slice(0, 0))
		}

		.info[] = sliceInfo{
			nextElem: internal.MakeSliceNextElemFunc(),
			scan:     schema.Scanner(.Type().Elem()),
		}
	}

	if len() == 0 {
		return 0, nil
	}
	 := makeDest(, len())

	var  int

	for .Next() {
		.scanIndex = 0
		if  := .Scan(...);  != nil {
			return 0, 
		}
		++
	}
	if  := .Err();  != nil {
		return 0, 
	}

	return , nil
}

func ( *sliceModel) ( interface{}) error {
	 := .info[.scanIndex]
	.scanIndex++

	 := .nextElem()
	return .scan(, )
}