Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
c42324c58f
|
|||
3a9c3f4e9e
|
|||
becd8f1ebc
|
@@ -70,7 +70,73 @@ func ArrEqualsExact[T comparable](arr1 []T, arr2 []T) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrAll(arr interface{}, fn func(int) bool) bool {
|
func ArrAll[T any](arr []T, fn func(T) bool) bool {
|
||||||
|
for _, av := range arr {
|
||||||
|
if !fn(av) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrAllErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) {
|
||||||
|
for _, av := range arr {
|
||||||
|
v, err := fn(av)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if !v {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrNone[T any](arr []T, fn func(T) bool) bool {
|
||||||
|
for _, av := range arr {
|
||||||
|
if fn(av) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrNoneErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) {
|
||||||
|
for _, av := range arr {
|
||||||
|
v, err := fn(av)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if v {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrAny[T any](arr []T, fn func(T) bool) bool {
|
||||||
|
for _, av := range arr {
|
||||||
|
if fn(av) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrAnyErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) {
|
||||||
|
for _, av := range arr {
|
||||||
|
v, err := fn(av)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if v {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArrIdxAll(arr any, fn func(int) bool) bool {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
if !fn(i) {
|
if !fn(i) {
|
||||||
@@ -80,7 +146,7 @@ func ArrAll(arr interface{}, fn func(int) bool) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrAllErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
func ArrIdxAllErr(arr any, fn func(int) (bool, error)) (bool, error) {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
v, err := fn(i)
|
v, err := fn(i)
|
||||||
@@ -94,7 +160,7 @@ func ArrAllErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrNone(arr interface{}, fn func(int) bool) bool {
|
func ArrIdxNone(arr any, fn func(int) bool) bool {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
if fn(i) {
|
if fn(i) {
|
||||||
@@ -104,7 +170,7 @@ func ArrNone(arr interface{}, fn func(int) bool) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrNoneErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
func ArrIdxNoneErr(arr any, fn func(int) (bool, error)) (bool, error) {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
v, err := fn(i)
|
v, err := fn(i)
|
||||||
@@ -118,7 +184,7 @@ func ArrNoneErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrAny(arr interface{}, fn func(int) bool) bool {
|
func ArrIdxAny(arr any, fn func(int) bool) bool {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
if fn(i) {
|
if fn(i) {
|
||||||
@@ -128,7 +194,7 @@ func ArrAny(arr interface{}, fn func(int) bool) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrAnyErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
func ArrIdxAnyErr(arr any, fn func(int) (bool, error)) (bool, error) {
|
||||||
av := reflect.ValueOf(arr)
|
av := reflect.ValueOf(arr)
|
||||||
for i := 0; i < av.Len(); i++ {
|
for i := 0; i < av.Len(); i++ {
|
||||||
v, err := fn(i)
|
v, err := fn(i)
|
||||||
@@ -142,7 +208,7 @@ func ArrAnyErr(arr interface{}, fn func(int) (bool, error)) (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrFirst[T comparable](arr []T, comp func(v T) bool) (T, bool) {
|
func ArrFirst[T any](arr []T, comp func(v T) bool) (T, bool) {
|
||||||
for _, v := range arr {
|
for _, v := range arr {
|
||||||
if comp(v) {
|
if comp(v) {
|
||||||
return v, true
|
return v, true
|
||||||
@@ -151,7 +217,7 @@ func ArrFirst[T comparable](arr []T, comp func(v T) bool) (T, bool) {
|
|||||||
return *new(T), false
|
return *new(T), false
|
||||||
}
|
}
|
||||||
|
|
||||||
func ArrLast[T comparable](arr []T, comp func(v T) bool) (T, bool) {
|
func ArrLast[T any](arr []T, comp func(v T) bool) (T, bool) {
|
||||||
found := false
|
found := false
|
||||||
result := *new(T)
|
result := *new(T)
|
||||||
for _, v := range arr {
|
for _, v := range arr {
|
||||||
|
@@ -107,3 +107,11 @@ func NumToStringOpt[V IntConstraint](v *V, fallback string) string {
|
|||||||
return fmt.Sprintf("%d", v)
|
return fmt.Sprintf("%d", v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func StrRepeat(val string, count int) string {
|
||||||
|
r := ""
|
||||||
|
for i := 0; i < count; i++ {
|
||||||
|
r += val
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
52
sq/scanner.go
Normal file
52
sq/scanner.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package sq
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ScanSingle[TData any](rows *sqlx.Rows, close bool) (TData, error) {
|
||||||
|
if rows.Next() {
|
||||||
|
var data TData
|
||||||
|
err := rows.StructScan(&data)
|
||||||
|
if err != nil {
|
||||||
|
return *new(TData), err
|
||||||
|
}
|
||||||
|
if rows.Next() {
|
||||||
|
_ = rows.Close()
|
||||||
|
return *new(TData), errors.New("sql returned more than onw row")
|
||||||
|
}
|
||||||
|
if close {
|
||||||
|
err = rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
return *new(TData), err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data, nil
|
||||||
|
} else {
|
||||||
|
if close {
|
||||||
|
_ = rows.Close()
|
||||||
|
}
|
||||||
|
return *new(TData), sql.ErrNoRows
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ScanAll[TData any](rows *sqlx.Rows, close bool) ([]TData, error) {
|
||||||
|
res := make([]TData, 0)
|
||||||
|
for rows.Next() {
|
||||||
|
var data TData
|
||||||
|
err := rows.StructScan(&data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
res = append(res, data)
|
||||||
|
}
|
||||||
|
if close {
|
||||||
|
err := rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
Reference in New Issue
Block a user