import numpy as np


# TODO: Should the encoder be responsible for mapping the message from [0, 1]^n to [-1, 1]^n?
#  (ie. should the encoder perform modulation?)
class Encoder:
    """Class implementing an encoder for block codes.
    """
    def __init__(self, G: np.array):
        """Construct a new Encoder object.

        :param G: Generator matrix
        """
        self._G = G

    def encode(self, d: np.array) -> np.array:
        """Map a given dataword onto the corresponding codeword.

        The returned codeword is mapped from [0, 1]^n onto [-1, 1]^n.

        :param d: Dataword (element of [0, 1]^n)
        :return: Codeword (already element of [-1, 1]^n)
        """
        return np.dot(d, self._G) * 2 - 1
