package types

import (
	
	
)

type Array struct {
	v reflect.Value

	append AppenderFunc
	scan   ScannerFunc
}

var (
	_ ValueAppender = (*Array)(nil)
	_ ValueScanner  = (*Array)(nil)
)

func ( interface{}) *Array {
	 := reflect.ValueOf()
	if !.IsValid() {
		panic(fmt.Errorf("pg: Array(nil)"))
	}

	return &Array{
		v: ,

		append: ArrayAppender(.Type()),
		scan:   ArrayScanner(.Type()),
	}
}

func ( *Array) ( []byte,  int) ([]byte, error) {
	if .append == nil {
		panic(fmt.Errorf("pg: Array(unsupported %s)", .v.Type()))
	}
	return .append(, .v, ), nil
}

func ( *Array) ( Reader,  int) error {
	if .scan == nil {
		return fmt.Errorf("pg: Array(unsupported %s)", .v.Type())
	}

	if .v.Kind() != reflect.Ptr {
		return fmt.Errorf("pg: Array(non-pointer %s)", .v.Type())
	}

	return .scan(.v.Elem(), , )
}

func ( *Array) () interface{} {
	if .v.IsValid() {
		return .v.Interface()
	}
	return nil
}