class Wait_Node ( Node ): 
	# d is a double
	def __init__(self, d): 
		Node.__init__(self)
		self.duration = Double_Node(d)
		self.type = 'Wait'
		assert(self.duration is not None)

	def print_children(self, indent_level): 
		self.duration.print_node(indent_level + 1, "(DURATION)")
	def __init__(self, var):  
		Node.__init__(self)
		if isinstance(var, float):
			self.string_value = None
			self.left_child = Double_Node(var)
			self.type = "ReturnStmt"
		else: 
			if isinstance(var, str): 
				self.string_value = var 
				self.type = "ReturnStmt"
class Loop_Node ( Node ): 
	# all doubles
	"""
	Loop_Node
		-> self.start -- represents the starting number (default is 0.0)
		-> self.end -- represents the end number
		-> self.increment -- represents the increment (default is 1.0)
		-> self.left_child -- as per usual, for the actions associated with the loop
		-> self.right_child -- same as above
	"""
	def __init__(self, e, s=0.0, i=1.0):
		Node.__init__(self)
		self.type = "LoopNInOrder"
		self.start = Double_Node(s)
		self.end = Double_Node(e)
		self.increment = Double_Node(i)
	"""
	prints the child nodes
	"""

	def print_children(self, indent_level): 
		self.start.print_node(indent_level + 1, "(START)")
		self.end.print_node(indent_level + 1, "(END)")
		self.increment.print_node(indent_level + 1, "(INCREMENT)")

		if self.left_child is not None: 
			self.left_child.print_node(indent_level + 1, "(ACTIONS)")
		if self.right_child is not None: 
			self.right_child.print_node(indent_level + 1)
class Return_Node ( Node ): 
	# var is either a double or a string
	def __init__(self, var):  
		Node.__init__(self)
		if isinstance(var, float):
			self.string_value = None
			self.left_child = Double_Node(var)
			self.type = "ReturnStmt"
		else: 
			if isinstance(var, str): 
				self.string_value = var 
				self.type = "ReturnStmt"

	# returns true if a string (other than true or false, which are bools) is being
	# returned. 
	def has_string_value(self): 
		if self.string_value is None: 
			return False
		if self.string_value == 'true' or self.string_value == 'false': 
			return False
		return True

	# returns the string value if it's a string. 
	def get_string_value(self): 
		if self.has_string_value() is True: 
			return self.string_value
		return None

	# prints the child nodes. 
	def print_children(self, indent_level): 
		if self.left_child is not None:
			self.left_child.print_node(indent_level + 1)
		else: 
			if self.string_value == "true" or self.string_value == "false": 
				print "Bool value: " + self.string_value
			else: 
				print "String value: " + self.string_value
	def __init__(self, e, s=0.0, i=1.0):
		Node.__init__(self)
		self.type = "LoopNInOrder"
		self.start = Double_Node(s)
		self.end = Double_Node(e)
		self.increment = Double_Node(i)
	def __init__(self, d): 
		Node.__init__(self)
		self.duration = Double_Node(d)
		self.type = 'Wait'
		assert(self.duration is not None)