def produce_line_values(p1: tuple, p2: tuple) -> list:
    """
    Return all values between two points, including the points

    :param p1: Point 1
    :param p2: Point 2
    :return: List of values between the two points
    """
    points = []
    # Horizontal
    if p1[0] == p2[0]:
        large, small = max(p1[1], p2[1]), min(p1[1], p2[1])
        for i in range(small, large + 1):
            points.append((p1[0], i))
        return points
    # Vertical
    if p1[1] == p2[1]:
        large, small = max(p1[0], p2[0]), min(p1[0], p2[0])
        for i in range(small, large + 1):
            points.append((i, p1[1]))
        return points
    # Diagonal
    direction = 0
    if p1[0] < p2[0]:
        direction = 1 if p1[1] < p2[1] else -1
    if p1[0] > p2[0]:
        direction = 1 if p1[1] > p2[1] else -1

    large_x, small_x = max(p1[0], p2[0]), min(p1[0], p2[0])
    large_y, small_y = max(p1[1], p2[1]), min(p1[1], p2[1])
    if direction == -1:
        large_y, small_y = small_y, large_y
    for x, y in zip(range(small_x, large_x + 1), range(small_y, large_y + direction, direction)):
        points.append((x, y))
    return points