package byteutil

import (
	
	
)

// BytesEncodeFunc type
type BytesEncodeFunc func(src []byte) []byte

// BytesDecodeFunc type
type BytesDecodeFunc func(src []byte) ([]byte, error)

// BytesEncoder interface
type BytesEncoder interface {
	Encode(src []byte) []byte
	Decode(src []byte) ([]byte, error)
}

// StdEncoder implement the BytesEncoder
type StdEncoder struct {
	encodeFn BytesEncodeFunc
	decodeFn BytesDecodeFunc
}

// NewStdEncoder instance
func ( BytesEncodeFunc,  BytesDecodeFunc) *StdEncoder {
	return &StdEncoder{
		encodeFn: ,
		decodeFn: ,
	}
}

// Encode input
func ( *StdEncoder) ( []byte) []byte {
	return .encodeFn()
}

// Decode input
func ( *StdEncoder) ( []byte) ([]byte, error) {
	return .decodeFn()
}

var (
	// HexEncoder instance
	HexEncoder = NewStdEncoder(func( []byte) []byte {
		 := make([]byte, hex.EncodedLen(len()))
		hex.Encode(, )
		return 
	}, func( []byte) ([]byte, error) {
		,  := hex.Decode(, )
		return [:], 
	})

	// B64Encoder instance
	B64Encoder = NewStdEncoder(func( []byte) []byte {
		 := make([]byte, base64.StdEncoding.EncodedLen(len()))
		base64.StdEncoding.Encode(, )
		return 
	}, func( []byte) ([]byte, error) {
		 := make([]byte, base64.StdEncoding.DecodedLen(len()))
		,  := base64.StdEncoding.Decode(, )
		if  != nil {
			return nil, 
		}

		return [:], 
	})
)