Sha256: fb7552455aca8f9c6c90313ed52cfe0fb011491b03be2885625ff734a173b19d

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

module Vedeu
  class Event

    # @param closure [Proc]
    # @param options [Hash]
    # @return [Event]
    def initialize(closure, options = {})
      @closure      = closure
      @options      = options
      @deadline     = 0
      @executed_at  = 0
      @now          = 0
    end

    # @param args [Array]
    # @return []
    def trigger(*args)
      return execute(*args) unless debouncing? || throttling?

      return execute(*args) if debouncing? && set_executed > deadline

      return execute(*args) if throttling? && elapsed_time > delay
    end

    private

    attr_reader   :closure
    attr_accessor :deadline, :executed_at, :now

    def execute(*args)
      reset_deadline

      set_executed

      reset_time

      closure.call(*args)
    end

    def throttling?
      set_time

      options[:delay] > 0
    end

    def debouncing?
      set_time

      set_deadline unless has_deadline?

      options[:debounce] > 0
    end

    def elapsed_time
      now - @executed_at
    end

    def set_executed
      @executed_at = now
    end

    def set_time
      @now = Time.now.to_f
    end

    def reset_time
      @now = 0
    end

    def has_deadline?
      @deadline > 0
    end

    def reset_deadline
      @deadline = 0
    end

    def set_deadline
      @deadline = now + debounce

      nil
    end

    def debounce
      options[:debounce]
    end

    def delay
      options[:delay]
    end

    def options
      defaults.merge!(@options)
    end

    def defaults
      {
        delay:    0,
        debounce: 0
      }
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vedeu-0.1.17 lib/vedeu/support/event.rb