Sha256: c09903eefc2b3163603e5899f9006afbad3acd99a841051288aba2edef60e73f

Contents?: true

Size: 1.53 KB

Versions: 2

Compression:

Stored size: 1.53 KB

Contents

module Dry
  module Monitor
    class Clock
      def measure(&block)
        start = current
        result = block.()
        stop = current
        [result, ((stop - start) * 1000).round(2)]
      end

      def current
        Time.now
      end
    end

    CLOCK = Clock.new

    class Event
      attr_reader :id

      attr_reader :info

      def initialize(id, info = {})
        @id = id
        @info = info
      end
    end

    class Notifications
      attr_reader :id
      attr_reader :events
      attr_reader :listeners
      attr_reader :clock

      def initialize(id)
        @id = id
        @listeners = Hash.new { |h, k| h[k] = [] }
        @events = {}
        @clock = CLOCK
      end

      def event(id, info = {})
        events[id] = Event.new(id, info) unless events.key?(id)
        self
      end

      def subscribe(event_id, listener = nil, &block)
        listeners[event_id] << (listener || block)
        self
      end

      def start(event_id, payload)
        instrument(event_id, payload)
      end

      def stop(event_id, payload)
        instrument(event_id, payload)
      end

      def instrument(event_id, payload = nil, &block)
        event = events[event_id]

        if block
          result, time = clock.measure(&block)
        end

        listeners[event_id].each do |listener|
          if time
            listener.(time, event.id, payload.merge(event.info))
          else
            listener.(event.id, payload.merge(event.info))
          end
        end

        result
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dry-monitor-0.0.3 lib/dry/monitor/notifications.rb
dry-monitor-0.0.2 lib/dry/monitor/notifications.rb