Class: LSystem::RulesEngine

Inherits:
Object
  • Object
show all
Extended by:
Loggability
Defined in:
lib/l_system/rules_engine.rb

Overview

An engine for iterating over successive applications of the L-System’s ruleset to its axiom.

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ RulesEngine

Create a new rules engine for an L-System. If the block is present, it is called with the new instance as self.



22
23
24
25
26
27
28
29
30
31
# File 'lib/l_system/rules_engine.rb', line 22

def initialize( &block )
	@variables = Set.new
	@constants = Set.new
	@axiom = nil
	@rules = []

	@rules_as_hash = nil

	self.instance_eval( &block ) if block
end

Instance Method Details

#alphabetObject

Return the system’s variables and constants.



85
86
87
# File 'lib/l_system/rules_engine.rb', line 85

def alphabet
	return @variables | @constants
end

#apply_rules(state) ⇒ Object

Apply the system’s rules to the given state and return the result.



122
123
124
125
126
127
# File 'lib/l_system/rules_engine.rb', line 122

def apply_rules( state )
	rules_hash = self.rules_as_hash
	return state.each_char.with_object( String.new(encoding: 'utf-8') ) do |char, new_state|
		new_state << rules_hash[ char ]
	end
end

#axiom(new_value = nil) ⇒ Object

Get/set the axiom of the system.



91
92
93
94
# File 'lib/l_system/rules_engine.rb', line 91

def axiom( new_value=nil )
	self.axiom = new_value if new_value
	return @axiom
end

#axiom=(new_value) ⇒ Object

Set the axiom of the system.



98
99
100
# File 'lib/l_system/rules_engine.rb', line 98

def axiom=( new_value )
	@axiom = new_value
end

#constants(*new_values) ⇒ Object

Get/set the system’s constants (the static parts of its alphabet).



64
65
66
67
# File 'lib/l_system/rules_engine.rb', line 64

def constants( *new_values )
	self.constants = new_values unless new_values.empty?
	return @constants.dup
end

#constants=(new_values) ⇒ Object

Set the systems constants to new_values.



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/l_system/rules_engine.rb', line 71

def constants=( new_values )
	@rules_as_hash = nil

	new_values = Set.new( new_values, &:to_s )
	unless new_values.disjoint?( self.variables )
		common_char = (new_values & self.variables).to_a.first
		raise ArgumentError, "%p is already included in the variable set" % [ common_char ]
	end

	@constants = new_values
end

#each(&block) ⇒ Object

Yield each successive generation to the given block, or return an Enumerator that will do so if no block is given.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/l_system/rules_engine.rb', line 132

def each( &block )
	iter = Enumerator.new do |yielder|
		state = new_state = self.axiom.dup

		begin
			yielder.yield( new_state )
			state = new_state
			new_state = self.apply_rules( state )
		end until state == new_state
	end

	return iter unless block
	return iter.each( &block )
end

#rules(*new_values) ⇒ Object

Get/set the system’s rules.



104
105
106
107
# File 'lib/l_system/rules_engine.rb', line 104

def rules( *new_values )
	self.rules = new_values unless new_values.empty?
	return @rules
end

#rules=(new_values) ⇒ Object

Set the system’s rules.



111
112
113
114
# File 'lib/l_system/rules_engine.rb', line 111

def rules=( new_values )
	@rules_as_hash = nil
	@rules = Array( new_values ).map( &:to_s )
end

#variables(*new_values) ⇒ Object

Get/set the system’s variables (the replaceable parts of its alphabet).



43
44
45
46
# File 'lib/l_system/rules_engine.rb', line 43

def variables( *new_values )
	self.variables = new_values unless new_values.empty?
	return @variables.dup
end

#variables=(new_values) ⇒ Object

Set the systems variables to new_values.



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/l_system/rules_engine.rb', line 50

def variables=( new_values )
	@rules_as_hash = nil

	new_values = Set.new( new_values, &:to_s )
	unless new_values.disjoint?( self.constants )
		common_char = (new_values & self.constants).to_a.first
		raise ArgumentError, "%p is already included in the constant set" % [ common_char ]
	end

	@variables = new_values
end