Skip to content

Instantly share code, notes, and snippets.

@jschairb
Last active December 17, 2015 02:39
Show Gist options
  • Save jschairb/5537757 to your computer and use it in GitHub Desktop.
Save jschairb/5537757 to your computer and use it in GitHub Desktop.
class Action
def self.error(target, arguments, transcript)
transcript.entries << { element: self, action: "error", result: :error }
:error
end
def self.failure(target, arguments, transcript)
transcript.entries << { element: self, action: "failure", result: :failure }
:failure
end
def self.success(target, arguments, transcript)
transcript.entries << { element: self, action: "success", result: :success }
:success
end
end
class Transcript
def initialize
@entries = []
end
def entries
@entries
end
end
class Results
def initialize
@entries = []
end
def capture(result)
@entries << result
end
def collect(&block)
capture(continue? ? yield : :skip)
self
end
def continue?
@entries.empty? || @entries.last == :success
end
end
class Performer
def actions
[].tap { |actions|
actions << Action.public_method(:success)
actions << Action.public_method(:success)
actions << Action.public_method(:failure)
actions << Action.public_method(:error)
actions << Action.public_method(:error)
}
end
def arguments
{}
end
def perform
actions.inject(Results.new) do |results, action|
results.collect { action.call(target, arguments, transcript) }
end
end
def target
{}
end
def transcript
@transcript ||= Transcript.new
end
end
performer = Performer.new
puts performer.perform.inspect
puts performer.transcript.inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment