pub type EventListener[T] = fn (T) !

pub struct EventController[T] {
mut:
	id        int
	listeners map[int]EventListener[T]
}

fn (mut ec EventController[T]) generate_id() int {
	return ec.id++
}

pub fn (mut ec EventController[T]) override(listener EventListener[T]) EventController[T] {
	ec.listeners.clear()
	return ec.listen(listener)
}

pub fn (mut ec EventController[T]) listen(listener EventListener[T]) EventController[T] {
	ec.listeners[ec.generate_id()] = listener
	return ec
}

struct Foo {}

struct Bar {}

fn make[T](i int) EventController[T] {
	return EventController[T]{
		id: i
	}
}

fn test_main() {
	mut a := EventController[Foo]{
		id: 1
		listeners: {
			1: fn (a Foo) ! {
				dump(1)
			}
		}
	}
	assert dump(a).id == 1
	assert dump(a).listeners.len == 1
	a.override(fn (a Foo) ! {
		dump(2)
	})
	assert dump(a).id == 2
	assert dump(a).listeners.len == 1
}
