Class: Async::Service::Environment::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/async/service/environment.rb

Overview

An evaluator is lazy read-only view of an environment. It memoizes all method calls.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEvaluator

Initialize a new evaluator.



171
172
173
# File 'lib/async/service/environment.rb', line 171

def initialize
	@cache = {}
end

Class Method Details

.wrap(environment) ⇒ Object

Create an evaluator wrapper for an environment.



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/async/service/environment.rb', line 140

def self.wrap(environment)
	evaluator = ::Class.new(self)
	
	facet = ::Module.new
	environment.included(facet)
	
	evaluator.include(facet)
	
	keys = []
	
	# Memoize all instance methods:
	facet.instance_methods.each do |name|
		instance_method = facet.instance_method(name)
		
		# Only memoize methods with no arguments:
		if instance_method.arity == 0
			keys << name
			
			evaluator.define_method(name) do
				@cache[name] ||= super()
			end
		end
	end
	
	# This lists all zero-argument methods:
	evaluator.define_method(:keys){keys}
	
	return evaluator.new
end

Instance Method Details

#[](key) ⇒ Object

Get value for a given key.



202
203
204
205
206
# File 'lib/async/service/environment.rb', line 202

def [](key)
	if self.key?(key)
		self.__send__(key)
	end
end

#inspectObject

Inspect representation of the evaluator.



177
178
179
# File 'lib/async/service/environment.rb', line 177

def inspect
	"#<#{Evaluator} #{self.keys}>"
end

#key?(key) ⇒ Boolean

Check if a key is available.

Returns:

  • (Boolean)


211
212
213
# File 'lib/async/service/environment.rb', line 211

def key?(key)
	self.keys.include?(key)
end

#to_hObject

Convert the evaluator to a hash.



183
184
185
186
187
188
189
190
# File 'lib/async/service/environment.rb', line 183

def to_h
	# Ensure all keys are evaluated:
	self.keys.each do |name|
		self.__send__(name)
	end
	
	return @cache
end

#to_jsonObject

Convert the evaluator to JSON.



195
196
197
# File 'lib/async/service/environment.rb', line 195

def to_json(...)
	self.to_h.to_json(...)
end