Skip to content

Instantly share code, notes, and snippets.

@freehuntx
Last active December 22, 2023 16:04
Show Gist options
  • Select an option

  • Save freehuntx/8471a14f4d9b54ece3634b53d94412fe to your computer and use it in GitHub Desktop.

Select an option

Save freehuntx/8471a14f4d9b54ece3634b53d94412fe to your computer and use it in GitHub Desktop.

Revisions

  1. freehuntx revised this gist Dec 22, 2023. 1 changed file with 11 additions and 10 deletions.
    21 changes: 11 additions & 10 deletions godot_eventemitter.gd
    Original file line number Diff line number Diff line change
    @@ -1,21 +1,22 @@
    class_name EventEmitter extends RefCounted

    var _listeners := {}
    var _listeners := {} # Holds listener arrays

    func emit(name: String, args:=[]):
    if not name in _listeners: return
    for e in _listeners[name]:
    e.fn.callv(args)
    _listeners[name] = _listeners[name].filter(func(e): return not e.once)
    if not name in _listeners: return # Skip if no listeners exist
    _listeners[name] = _listeners[name].filter(func(e): return e.fn.get_object() != null) # Remove null instances
    for e in _listeners[name]: # Iterate callbacks
    e.fn.callv(args) # Call callback
    _listeners[name] = _listeners[name].filter(func(e): return not e.once) # Remove "once" listeners

    func once(name: String, fn: Callable) -> Callable:
    return on(name, fn, true)

    func on(name: String, fn: Callable, once:=false) -> Callable:
    if not name in _listeners: _listeners[name] = []
    _listeners[name].append({ "fn": fn, "once": once })
    return off.bind(name, fn, once)
    if not name in _listeners: _listeners[name] = [] # Create listeners array if not exist
    _listeners[name].append({ "fn": fn, "once": once }) # Add listener function
    return off.bind(name, fn, once) # Create unregister callback as result

    func off(name: String, fn: Callable, once:=false) -> void:
    if not name in _listeners: return
    _listeners[name] = _listeners[name].filter(func(e): return e.fn != fn and e.once != once)
    if not name in _listeners: return # Skip if no listeners exist
    _listeners[name] = _listeners[name].filter(func(e): return e.fn != fn and e.once != once) # Remove the specific listener
  2. freehuntx created this gist Dec 18, 2023.
    21 changes: 21 additions & 0 deletions godot_eventemitter.gd
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    class_name EventEmitter extends RefCounted

    var _listeners := {}

    func emit(name: String, args:=[]):
    if not name in _listeners: return
    for e in _listeners[name]:
    e.fn.callv(args)
    _listeners[name] = _listeners[name].filter(func(e): return not e.once)

    func once(name: String, fn: Callable) -> Callable:
    return on(name, fn, true)

    func on(name: String, fn: Callable, once:=false) -> Callable:
    if not name in _listeners: _listeners[name] = []
    _listeners[name].append({ "fn": fn, "once": once })
    return off.bind(name, fn, once)

    func off(name: String, fn: Callable, once:=false) -> void:
    if not name in _listeners: return
    _listeners[name] = _listeners[name].filter(func(e): return e.fn != fn and e.once != once)