"""
B-ASIC Signal Module.
TODO: More info.
"""

from b_asic.operation import Operation
from typing import NewType

SignalId = NewType("SignalId", int)

class SignalSource:
	"""
	Handle to a signal source.
	TODO: More info.
	"""
	operation: Operation
	port_index: int

	def __init__(self, operation: Operation, port_index: int):
		"""
		Construct a SignalSource.
		"""
		self.operation = operation
		self.port_index = port_index

	# TODO: More stuff.

class SignalDestination:
	"""
	Handle to a signal destination.
	TODO: More info.
	"""
	operation: Operation
	port_index: int

	def __init__(self, operation: Operation, port_index: int):
		"""
		Construct a SignalDestination.
		"""
		self.operation = operation
		self.port_index = port_index

	# TODO: More stuff.

class Signal:
	"""
	A connection between two operations consisting of a source and destination handle.
	TODO: More info.
	"""
	_identifier: SignalId
	source: SignalSource
	destination: SignalDestination

	def __init__(self, identifier: SignalId, source: SignalSource, destination: SignalDestination):
		"""
		Construct a Signal.
		"""
		self._identifier = identifier
		self.source = source
		self.destination = destination

	def identifier(self) -> SignalId:
		"""
		Get the unique identifier.
		"""
		return self._identifier

	# TODO: More stuff.