Class: Mutant::Variable Private

Inherits:
Object
  • Object
show all
Defined in:
lib/mutant/variable.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Lightweight concurrency variables

These are inspired by Haskells MVar and IVar types.

Direct Known Subclasses

IVar, MVar

Defined Under Namespace

Modules: Timer Classes: IVar, MVar, Result

Constant Summary collapse

EMPTY =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Class.new do
  const_set(:INSPECT, 'Variable::EMPTY')
end.new.freeze
TIMEOUT =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Class.new do
  const_set(:INSPECT, 'Variable::TIMEOUT')
end.new.freeze

Instance Method Summary collapse

Constructor Details

#initialize(condition_variable:, mutex:, value: EMPTY) ⇒ undefined

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize object

Parameters:

  • value (Object) (defaults to: EMPTY)

    the initial value



82
83
84
85
86
# File 'lib/mutant/variable.rb', line 82

def initialize(condition_variable:, mutex:, value: EMPTY)
  @full  = condition_variable.new
  @mutex = mutex.new
  @value = value
end

Instance Method Details

#readObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Read value, block on empty

Returns:

  • (Object)

    the variable value



121
122
123
124
125
126
# File 'lib/mutant/variable.rb', line 121

def read
  synchronize do
    wait_full
    @value
  end
end

#takeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Take value, block on empty

Returns:

  • (Object)


91
92
93
94
95
96
# File 'lib/mutant/variable.rb', line 91

def take
  synchronize do
    wait_full
    perform_take
  end
end

#take_timeout(timeout) ⇒ Result::Timeout, Result::Value

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Take value, with timeout

Parameters:

  • Timeout (Float)

Returns:



107
108
109
110
111
112
113
114
115
# File 'lib/mutant/variable.rb', line 107

def take_timeout(timeout)
  synchronize do
    if wait_timeout(@full, timeout, &method(:full?))
      Result::Timeout.new
    else
      Result::Value.new(perform_take)
    end
  end
end

#try_put(value) ⇒ self

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Try put value into the variable, non blocking

Parameters:

  • value (Object)

Returns:

  • (self)


133
134
135
136
137
138
139
# File 'lib/mutant/variable.rb', line 133

def try_put(value)
  synchronize do
    perform_put(value) if empty?
  end

  self
end

#with {|Object| ... } ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Execute block with value, blocking

Yields:

  • (Object)

Returns:

  • (Object)

    the blocks return value



147
148
149
150
151
152
# File 'lib/mutant/variable.rb', line 147

def with
  synchronize do
    wait_full
    yield @value
  end
end