from functools import partial from .location import Location from ..signals import Signal class Antenna(Location): """ A location able to interact with a signal. Either emitting or receiving. Optionally applies a transformation to the traced signal. """ def __repr__(self): return "Antenna({})".format(repr(self.x)) def emit(self, signal: Signal) -> callable: return partial(signal, x_0=self.x) def recv(self, signal: Signal) -> callable: """ Return a function that traces the signal as a function of time at the antenna's location """ return partial(signal, x_f=self.x) receive = recv class Receiver(Antenna): """ An antenna which main purpose is to trace a signal over time. Optionally applies a transformation to the traced signal. """ def __repr__(self): return "Receiver({})".format(repr(self.x)) class Emitter(Antenna): """ An antenna which main purpose is to emit a signal. """ def __repr__(self): return "Emitter({})".format(repr(self.x))