package lz4

import (
	
	
	

	
)

//go:generate go run golang.org/x/tools/cmd/stringer -type=aState -output state_gen.go

const (
	noState     aState = iota // uninitialized reader
	errorState                // unrecoverable error encountered
	newState                  // instantiated object
	readState                 // reading data
	writeState                // writing data
	closedState               // all done
)

type (
	aState uint8
	_State struct {
		states []aState
		state  aState
		err    error
	}
)

func ( *_State) ( []aState) {
	.states = 
	.state = [0]
}

func ( *_State) () {
	.state = .states[0]
	.err = nil
}

// next sets the state to the next one unless it is passed a non nil error.
// It returns whether or not it is in error.
func ( *_State) ( error) bool {
	if  != nil {
		.err = fmt.Errorf("%s: %w", .state, )
		.state = errorState
		return true
	}
	.state = .states[.state]
	return false
}

// nextd is like next but for defers.
func ( *_State) ( *error) bool {
	return  != nil && .next(*)
}

// check sets s in error if not already in error and if the error is not nil or io.EOF,
func ( *_State) ( *error) {
	if .state == errorState ||  == nil {
		return
	}
	if  := *;  != nil {
		.err = fmt.Errorf("%w[%s]", , .state)
		if !errors.Is(, io.EOF) {
			.state = errorState
		}
	}
}

func ( *_State) () error {
	.state = errorState
	.err = fmt.Errorf("%w[%s]", lz4errors.ErrInternalUnhandledState, .state)
	return .err
}