Sha256: ac89cc04504dcb11dc32e206bf62804f3af0915412ba3b904731288b47488697

Contents?: true

Size: 1.23 KB

Versions: 5

Compression:

Stored size: 1.23 KB

Contents

# typed: true
# frozen_string_literal: true

require 'sorbet-runtime'

module Frontman
  module DispatchEvents
    extend T::Sig

    sig { returns(T::Hash[Symbol, T::Array[T.untyped]]) }
    def listeners
      @listeners ||= {}
    end

    sig do
      params(events: T.any(Symbol, String), callback: T.untyped)
        .returns(T.self_type)
    end
    def on(events, callback)
      list(events).each do |event_name|
        listeners[event_name.to_sym] ||= []
        T.must(listeners[event_name.to_sym]).push(callback)
      end

      self
    end

    # We don't annotate with sig because of bad support for splat arguments
    def emit(events, *arguments)
      list(events).each do |event_name|
        event_listeners = listeners[event_name.to_sym] || []
        event_listeners.each do |listener|
          listener.call(*arguments)
        end
      end

      self
    end

    sig { params(events: T.any(Symbol, String)).returns(T.self_type) }
    def off(events)
      list(events).each do |event_name|
        listeners[event_name.to_sym] = []
      end

      self
    end

    private

    sig { params(events: T.any(Symbol, String)).returns(T::Array[String]) }
    def list(events)
      events.to_s.split(',').map(&:strip)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
frontman-ssg-0.1.1 lib/frontman/concerns/dispatch_events.rb
frontman-ssg-0.1.0 lib/frontman/concerns/dispatch_events.rb
frontman-ssg-0.0.4 lib/frontman/concerns/dispatch_events.rb
frontman-ssg-0.0.3 lib/frontman/concerns/dispatch_events.rb
frontman-ssg-0.0.2 lib/frontman/concerns/dispatch_events.rb