Class: Zoidberg::Task

Inherits:
Object
  • Object
show all
Defined in:
lib/zoidberg/task.rb

Overview

Run a task

Constant Summary collapse

SUPPORTED_STYLES =

Supported task styles

[:serial, :async]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(task_style, origin, block_args = []) { ... } ⇒ self

Create a new task

Parameters:

  • task_style (Symbol)
  • origin (Object)

    origin object of block

Yields:

  • block to execute



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/zoidberg/task.rb', line 27

def initialize(task_style, origin, block_args=[], &block)
  unless(SUPPORTED_STYLES.include?(task_style))
    raise ArgumentError.new("Allowed style values: #{SUPPORTED_STYLES.map(&:inspect).join(', ')} but received: #{task_style.inspect}")
  end
  @style = task_style
  @origin = origin
  @content = block
  @content_arguments = block_args
  @result = nil
  send("run_#{style}")
end

Instance Attribute Details

#contentProc (readonly)

Returns block to execute.

Returns:

  • (Proc)

    block to execute



16
17
18
# File 'lib/zoidberg/task.rb', line 16

def content
  @content
end

#content_argumentsObject (readonly)

Returns the value of attribute content_arguments.



17
18
19
# File 'lib/zoidberg/task.rb', line 17

def content_arguments
  @content_arguments
end

#originObject (readonly)

Returns originator of task.

Returns:

  • (Object)

    originator of task



14
15
16
# File 'lib/zoidberg/task.rb', line 14

def origin
  @origin
end

#styleSymbol (readonly)

Returns :fiber or :thread.

Returns:

  • (Symbol)

    :fiber or :thread



12
13
14
# File 'lib/zoidberg/task.rb', line 12

def style
  @style
end

#taskThread, Fiber (readonly)

Returns underlying task container.

Returns:

  • (Thread, Fiber)

    underlying task container



19
20
21
# File 'lib/zoidberg/task.rb', line 19

def task
  @task
end

Instance Method Details

#cease(*args) ⇒ Object+

Reliquish running state and return optional value(s)

Parameters:

  • args (Object)

    values to return

Returns:

  • (Object, Array<Object>)


91
92
93
94
95
96
97
98
99
# File 'lib/zoidberg/task.rb', line 91

def cease(*args)
  if(style == :async)
    task[:task_args] = args
    task.stop
    task[:task_args]
  else
    Fiber.yield(*args)
  end
end

#complete?TrueClass, FalseClass

Returns task is complete.

Returns:

  • (TrueClass, FalseClass)

    task is complete



73
74
75
# File 'lib/zoidberg/task.rb', line 73

def complete?
  task.nil? || !task.alive?
end

#error?TrueClass, FalseClass

Returns task complete in error state.

Returns:

  • (TrueClass, FalseClass)

    task complete in error state



78
79
80
# File 'lib/zoidberg/task.rb', line 78

def error?
  complete? && value.is_a?(Exception)
end

#halt!NilClass

Force task to stop prior to completion if still in running state

Returns:

  • (NilClass)


50
51
52
53
54
55
56
# File 'lib/zoidberg/task.rb', line 50

def halt!
  if(style == :async)
    task.kill
  else
    @task = nil
  end
end

#proceed(*args) ⇒ Object+

Regain running state with optional value(s)

Parameters:

  • args (Object)

    values to provide

Returns:

  • (Object, Array<Object>)


104
105
106
107
108
109
110
111
112
# File 'lib/zoidberg/task.rb', line 104

def proceed(*args)
  if(style == :serial)
    task.resume(*args)
  else
    task[:task_args] = args
    task.run
    task[:task_args]
  end
end

#running?TrueClass, FalseClass

Returns task is running.

Returns:

  • (TrueClass, FalseClass)

    task is running



64
65
66
67
68
69
70
# File 'lib/zoidberg/task.rb', line 64

def running?
  if(task)
    style == :async && task.alive? && !task.stop?
  else
    false
  end
end

#success?TrueClass, FalseClass

Returns task complete in success state.

Returns:

  • (TrueClass, FalseClass)

    task complete in success state



83
84
85
# File 'lib/zoidberg/task.rb', line 83

def success?
  complete? && !error?
end

#valueObject

Returns result of task.

Returns:

  • (Object)

    result of task



40
41
42
43
44
45
# File 'lib/zoidberg/task.rb', line 40

def value
  if(task.alive?)
    @result = style == :async ? task.join : task.resume
  end
  @result
end

#waiting?TrueClass, FalseClass

Returns task currently waiting to run.

Returns:

  • (TrueClass, FalseClass)

    task currently waiting to run



59
60
61
# File 'lib/zoidberg/task.rb', line 59

def waiting?
  task && task.alive? && task.respond_to?(:stop?) ? task.stop? : true
end