package gojay

// EncodeArray encodes an implementation of MarshalerJSONArray to JSON
func ( *Encoder) ( MarshalerJSONArray) error {
	if .isPooled == 1 {
		panic(InvalidUsagePooledEncoderError("Invalid usage of pooled encoder"))
	}
	_, _ = .encodeArray()
	,  := .Write()
	if  != nil {
		.err = 
		return 
	}
	return nil
}
func ( *Encoder) ( MarshalerJSONArray) ([]byte, error) {
	.grow(200)
	.writeByte('[')
	.MarshalJSONArray()
	.writeByte(']')
	return .buf, .err
}

// AddArray adds an implementation of MarshalerJSONArray to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement Marshaler
func ( *Encoder) ( MarshalerJSONArray) {
	.Array()
}

// AddArrayOmitEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerAddArrayOmitEmpty
func ( *Encoder) ( MarshalerJSONArray) {
	.ArrayOmitEmpty()
}

// AddArrayNullEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement Marshaler, if v is empty, `null` will be encoded`
func ( *Encoder) ( MarshalerJSONArray) {
	.ArrayNullEmpty()
}

// AddArrayKey adds an array or slice to be encoded, must be used inside an object as it will encode a key
// value must implement Marshaler
func ( *Encoder) ( string,  MarshalerJSONArray) {
	.ArrayKey(, )
}

// AddArrayKeyOmitEmpty adds an array or slice to be encoded and skips it if it is nil.
// Must be called inside an object as it will encode a key.
func ( *Encoder) ( string,  MarshalerJSONArray) {
	.ArrayKeyOmitEmpty(, )
}

// AddArrayKeyNullEmpty adds an array or slice to be encoded and skips it if it is nil.
// Must be called inside an object as it will encode a key. `null` will be encoded`
func ( *Encoder) ( string,  MarshalerJSONArray) {
	.ArrayKeyNullEmpty(, )
}

// Array adds an implementation of MarshalerJSONArray to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement Marshaler
func ( *Encoder) ( MarshalerJSONArray) {
	if .IsNil() {
		.grow(3)
		 := .getPreviousRune()
		if  != '[' {
			.writeByte(',')
		}
		.writeByte('[')
		.writeByte(']')
		return
	}
	.grow(100)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	.writeByte('[')
	.MarshalJSONArray()
	.writeByte(']')
}

// ArrayOmitEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement Marshaler
func ( *Encoder) ( MarshalerJSONArray) {
	if .IsNil() {
		return
	}
	.grow(4)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	.writeByte('[')
	.MarshalJSONArray()
	.writeByte(']')
}

// ArrayNullEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement Marshaler
func ( *Encoder) ( MarshalerJSONArray) {
	.grow(4)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	if .IsNil() {
		.writeBytes(nullBytes)
		return
	}
	.writeByte('[')
	.MarshalJSONArray()
	.writeByte(']')
}

// ArrayKey adds an array or slice to be encoded, must be used inside an object as it will encode a key
// value must implement Marshaler
func ( *Encoder) ( string,  MarshalerJSONArray) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	if .IsNil() {
		.grow(2 + len())
		 := .getPreviousRune()
		if  != '{' {
			.writeByte(',')
		}
		.writeByte('"')
		.writeStringEscape()
		.writeBytes(objKeyArr)
		.writeByte(']')
		return
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyArr)
	.MarshalJSONArray()
	.writeByte(']')
}

// ArrayKeyOmitEmpty adds an array or slice to be encoded and skips if it is nil.
// Must be called inside an object as it will encode a key.
func ( *Encoder) ( string,  MarshalerJSONArray) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	if .IsNil() {
		return
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyArr)
	.MarshalJSONArray()
	.writeByte(']')
}

// ArrayKeyNullEmpty adds an array or slice to be encoded and encodes `null`` if it is nil.
// Must be called inside an object as it will encode a key.
func ( *Encoder) ( string,  MarshalerJSONArray) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	if .IsNil() {
		.writeBytes(nullBytes)
		return
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyArr)
	.MarshalJSONArray()
	.writeByte(']')
}

// EncodeArrayFunc is a custom func type implementing MarshaleArray.
// Use it to cast a func(*Encoder) to Marshal an object.
//
//	enc := gojay.NewEncoder(io.Writer)
//	enc.EncodeArray(gojay.EncodeArrayFunc(func(enc *gojay.Encoder) {
//		enc.AddStringKey("hello", "world")
//	}))
type EncodeArrayFunc func(*Encoder)

// MarshalJSONArray implements MarshalerJSONArray.
func ( EncodeArrayFunc) ( *Encoder) {
	()
}

// IsNil implements MarshalerJSONArray.
func ( EncodeArrayFunc) () bool {
	return  == nil
}