Sha256: 936de61127fed27a9f96b97b1b861bd17cb0a12f025251330e4e751dc8bc8464

Contents?: true

Size: 827 Bytes

Versions: 1

Compression:

Stored size: 827 Bytes

Contents

class Spreadshit::Cell
  attr_reader :raw

  def initialize(raw = "", &expression)
    @raw = raw
    @observers = Set.new
    @observed = []
    update(&expression) if block_given?
  end

  def value
    if @@caller
      @observers << @@caller
      @@caller.observed << self
    end
    @value
  end

  def update(value = raw || "", &expression)
    @raw = value
    @expression = expression
    compute
    @value
  end

  protected

  attr_reader :observers, :observed

  def compute
    @observed.each { |observed| observed.observers.delete(self) }
    @observed = []

    @@caller = self
    new_value = @expression.call
    @@caller = nil

    if new_value != @value
      @value = new_value
      observers = @observers
      @observers = Set.new
      observers.each { |observer| observer.compute }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
spreadshit-0.1.1 lib/spreadshit/cell.rb