require 'celluloid'
module Elaine
  module Distributed
    class Vertex
      # include Celluloid
      # include Celluloid::Logger

      attr_reader :id
      attr_accessor :value, :messages

      def initialize(id, value, postoffice, outedges)
        # Might be better to grab post_office dynamically with Celluloid::Actor ?
        @id = id
        @value = value
        @outedges = outedges
        @messages = []
        @active = true
        @superstep = 0
        @postoffice = postoffice
      end

      def edges
        block_given? ? @outedges.each {|e| yield e} : @outedges
      end

      def deliver_to_all_neighbors(msg)
        edges.each {|e| deliver(e, msg)}
      end

      def deliver(to, msg)
       @postoffice.async.deliver(to, msg)
      end

      def step
        @superstep += 1
        # debug "Running super step ##{@superstep}"
        compute
      end

      def halt;     @active = false;  end
      def active!;  @active = true;   end
      def active?;  @active;          end

      def superstep; @superstep; end
      def neighbors; @outedges; end

      def vote_to_stop; @active = false; end

      def compute; end
    end # class Vertex
  end # module Distributed
end # module Elaine