Class: QuackConcurrency::Future

Inherits:
ConcurrencyTool show all
Defined in:
lib/quack_concurrency/future.rb,
lib/quack_concurrency/future/canceled.rb,
lib/quack_concurrency/future/complete.rb

Defined Under Namespace

Classes: Canceled, Complete

Instance Method Summary collapse

Methods inherited from ConcurrencyTool

#setup_duck_types

Constructor Details

#initialize(duck_types: nil) ⇒ Future

Creates a new Future concurrency tool.

Parameters:

  • duck_types (Hash) (defaults to: nil)

    hash of core Ruby classes to overload. If a Hash is given, the keys :condition_variable and :mutex must be present.



8
9
10
11
12
13
14
15
# File 'lib/quack_concurrency/future.rb', line 8

def initialize(duck_types: nil)
  classes = setup_duck_types(duck_types)
  @condition_variable = classes[:condition_variable].new
  @mutex = classes[:mutex].new
  @value = nil
  @value_set = false
  @complete = false
end

Instance Method Details

#cancelvoid

This method returns an undefined value.

Cancels the future.

Raises:

  • (Complete)

    if the future is already completed



20
21
22
23
24
25
26
27
# File 'lib/quack_concurrency/future.rb', line 20

def cancel
  @mutex.synchronize do
    raise Complete if @complete
    @complete = true
    @condition_variable.broadcast
  end
  nil
end

#complete?Boolean

Checks if future has a value or is canceled.

Returns:

  • (Boolean)


31
32
33
# File 'lib/quack_concurrency/future.rb', line 31

def complete?
  @complete
end

#getObject

Note:

This method will block until the future has completed.

Gets the value of the future.

Returns:

  • value of the future

Raises:

  • (Canceled)

    if the future is canceled



39
40
41
42
43
44
45
46
# File 'lib/quack_concurrency/future.rb', line 39

def get
  @mutex.synchronize do
    @condition_variable.wait(@mutex) unless complete?
    raise 'internal error, invalid state' unless complete?
    raise Canceled unless @value_set
    @value
  end
end

#set(new_value = nil) ⇒ void

This method returns an undefined value.

Sets the value of the future.

Parameters:

  • new_value (defaults to: nil)

    value to assign to future

Raises:

  • (Complete)

    if the future has already completed



52
53
54
55
56
57
58
59
60
61
# File 'lib/quack_concurrency/future.rb', line 52

def set(new_value = nil)
  @mutex.synchronize do
    raise Complete if @complete
    @value_set = true
    @complete = true
    @value = new_value
    @condition_variable.broadcast
  end
  nil
end