package reuseport

import (
	

	
	ma 
	manet 
)

type listener struct {
	manet.Listener
	network *network
}

func ( *listener) () error {
	.network.mu.Lock()
	delete(.network.listeners, )
	.network.dialer = nil
	.network.mu.Unlock()
	return .Listener.Close()
}

// Listen listens on the given multiaddr.
//
// If reuseport is supported, it will be enabled for this listener and future
// dials from this transport may reuse the port.
//
// Note: You can listen on the same multiaddr as many times as you want
// (although only *one* listener will end up handling the inbound connection).
func ( *Transport) ( ma.Multiaddr) (manet.Listener, error) {
	, ,  := manet.DialArgs()
	if  != nil {
		return nil, 
	}
	var  *network
	switch  {
	case "tcp4":
		 = &.v4
	case "tcp6":
		 = &.v6
	default:
		return nil, ErrWrongProto
	}

	if !reuseport.Available() {
		return manet.Listen()
	}
	,  := reuseport.Listen(, )
	if  != nil {
		return manet.Listen()
	}

	if ,  := .Addr().(*net.TCPAddr); ! {
		.Close()
		return nil, ErrWrongProto
	}

	,  := manet.WrapNetListener()
	if  != nil {
		.Close()
		return nil, 
	}

	 := &listener{
		Listener: ,
		network:  ,
	}

	.mu.Lock()
	defer .mu.Unlock()

	if .listeners == nil {
		.listeners = make(map[*listener]struct{})
	}
	.listeners[] = struct{}{}
	.dialer = nil

	return , nil
}