package advsql // import ( // "database/sql" // ) // type Stmt[M any] struct { // stmt *sql.Stmt // scan func(Scanner) (*M, error) // } // func NewStmt[M any](db *Database, query string, scan func(s Scanner) (*M, error)) (*Stmt[M], error) { // s, err := db.db.Prepare(query) // if err != nil { // return nil, err // } // stmt := Stmt[M]{ // stmt: s, // scan: scan, // } // db.closefuncs = append(db.closefuncs, stmt.Close) // return &stmt, err // } // func (stmt *Stmt[M]) Close() error { // return stmt.stmt.Close() // } // func (stmt *Stmt[M]) Many(args ...interface{}) (<-chan *M, error) { // rows, err := stmt.stmt.Query(args...) // if err != nil { // return nil, err // } // out := make(chan *M, 10) // go func() { // defer rows.Close() // defer close(out) // for rows.Next() { // if v, err := stmt.scan(rows); err == nil { // out <- v // } // } // }() // return out, nil // } // func (stmt *Stmt[M]) Single(args ...interface{}) (*M, error) { // rows, err := stmt.stmt.Query(args...) // if err != nil { // return nil, err // } // defer rows.Close() // return stmt.scan(rows) // }