class BLOCK_FUNCTION():
#this is the shell 
	name = "Generic"
	def __init__(self):
		pass
	def __name__(self):
		return self.name
	def on(self, *args):
		return True
	def off(self, *args):
		return True


class func_and(BLOCK_FUNCTION):
	name = "And"
	def on(self,*args):
		if all(args):
			return True
		else:
			return False
class func_or(BLOCK_FUNCTION):
	name = "Or"
	def on(self,*args):
		if any(args):
			return True
		else:
			return False

class func_not(BLOCK_FUNCTION):#returns the opposite of the first term, ignoring the rest
	name = "Not"
	def on(self,*args):
		if args:
			return not args[0]
		else:
			return False
class func_add(BLOCK_FUNCTION):
	name = "+"
	def on(self,*args):
		if args:
			if len(args) > 2:
				val = int(args[0])
				val += int(args[1])
				args[2].set(val)

class func_gt(BLOCK_FUNCTION):
	name = ">"
	def on(self,*args):
		if len(args)>1:
			if args[0] > args[1]:
				return True
			else:
				return False
		else:
			return False

class func_set(BLOCK_FUNCTION):
	name = "Set"
	def on(self,*args):
		if args:
			if len(args) > 1:
				args[0].set(args[1])
				return args[0]

class func_close(BLOCK_FUNCTION):
	name = "Close"
	def on(self,*args):
		if args:
			args[0].set(True)
	def off(self,*args):
		if args:
			args[0].set(False)


BLOCK_FUNCTION_LIST = [func_and, func_or, func_not, func_add, func_gt, func_set, func_close]
BLOCK_FUNCTION_DICT = dict(zip(map(lambda x:x.name,BLOCK_FUNCTION_LIST),BLOCK_FUNCTION_LIST))
DEFAULT = func_close
