package wasm

import (
	
	
)

// deleteModule makes the moduleName available for instantiation again.
func ( *Store) ( *ModuleInstance) error {
	.mux.Lock()
	defer .mux.Unlock()

	// Remove this module name.
	if .prev != nil {
		.prev.next = .next
	}
	if .next != nil {
		.next.prev = .prev
	}
	if .moduleList ==  {
		.moduleList = .next
	}
	// Clear the m state so it does not enter any other branch
	// on subsequent calls to deleteModule.
	.prev = nil
	.next = nil

	if .ModuleName != "" {
		delete(.nameToModule, .ModuleName)

		// Shrink the map if it's allocated more than twice the size of the list
		 := len(.nameToModule)
		if  < nameToModuleShrinkThreshold {
			 = nameToModuleShrinkThreshold
		}
		if *2 <= .nameToModuleCap {
			 := make(map[string]*ModuleInstance, )
			for ,  := range .nameToModule {
				[] = 
			}
			.nameToModule = 
			.nameToModuleCap = 
		}
	}
	return nil
}

// module returns the module of the given name or error if not in this store
func ( *Store) ( string) (*ModuleInstance, error) {
	.mux.RLock()
	defer .mux.RUnlock()
	,  := .nameToModule[]
	if ! {
		return nil, fmt.Errorf("module[%s] not instantiated", )
	}
	return , nil
}

// registerModule registers a ModuleInstance into the store.
// This makes the ModuleInstance visible for import if it's not anonymous, and ensures it is closed when the store is.
func ( *Store) ( *ModuleInstance) error {
	.mux.Lock()
	defer .mux.Unlock()

	if .nameToModule == nil {
		return errors.New("already closed")
	}

	if .ModuleName != "" {
		if ,  := .nameToModule[.ModuleName];  {
			return fmt.Errorf("module[%s] has already been instantiated", .ModuleName)
		}
		.nameToModule[.ModuleName] = 
		if len(.nameToModule) > .nameToModuleCap {
			.nameToModuleCap = len(.nameToModule)
		}
	}

	// Add the newest node to the moduleNamesList as the head.
	.next = .moduleList
	if .next != nil {
		.next.prev = 
	}
	.moduleList = 
	return nil
}

// Module implements wazero.Runtime Module
func ( *Store) ( string) *ModuleInstance {
	,  := .module()
	if  != nil {
		return nil
	}
	return 
}