Data Oriented Paradigm#

Initial Set-Up#

from pyrsistent import PRecord, field


class SinglePoint(PRecord):
    a: int = field(mandatory=True)


class DoublePoint(PRecord):
    a: SinglePoint = field(mandatory=True)
    b: SinglePoint = field(mandatory=True)

Predecessor and Successor#

def predecessor(single_point: SinglePoint) -> SinglePoint:
    result = single_point.a - 1
    return SinglePoint(a=result)


assert predecessor(SinglePoint(a=1)) == SinglePoint(a=0)
assert predecessor(SinglePoint(a=10)) == SinglePoint(a=9)
def successor(single_point: SinglePoint) -> SinglePoint:
    result = single_point.a + 1
    return SinglePoint(a=result)


assert successor(SinglePoint(a=0)) == SinglePoint(a=1)
assert successor(SinglePoint(a=10)) == SinglePoint(a=11)

Addition#

def addition(addends: DoublePoint) -> SinglePoint:
    result = addends.a
    for _ in range(addends.b.a):
        result = successor(result)
    return result


assert addition(DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=0))) == SinglePoint(a=0)
assert addition(DoublePoint(a=SinglePoint(a=1), b=SinglePoint(a=0))) == SinglePoint(a=1)
assert addition(DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=1))) == SinglePoint(a=1)
assert addition(DoublePoint(a=SinglePoint(a=10), b=SinglePoint(a=10))) == SinglePoint(
    a=20
)

Multiplication#

def multiplication(factors: DoublePoint) -> SinglePoint:
    result = SinglePoint(a=0)

    if factors.a.a == 0 or factors.b.a == 0:
        return result

    for _ in range(factors.b.a):
        result = addition(DoublePoint(a=result, b=factors.a))

    return result


assert multiplication(
    DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=0))
) == SinglePoint(a=0)
assert multiplication(
    DoublePoint(a=SinglePoint(a=2), b=SinglePoint(a=0))
) == SinglePoint(a=0)
assert multiplication(
    DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=2))
) == SinglePoint(a=0)
assert multiplication(
    DoublePoint(a=SinglePoint(a=10), b=SinglePoint(a=10))
) == SinglePoint(a=100)

Exponentiation#

def exponentiation(base: SinglePoint, exponent: SinglePoint) -> SinglePoint:
    result = SinglePoint(a=1)
    for _ in range(exponent.a):
        result = multiplication(DoublePoint(a=result, b=base))
    return result


assert exponentiation(SinglePoint(a=1), SinglePoint(a=0)) == SinglePoint(
    a=1
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))
assert exponentiation(SinglePoint(a=0), SinglePoint(a=1)) == SinglePoint(
    a=0
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))
assert exponentiation(SinglePoint(a=3), SinglePoint(a=3)) == SinglePoint(
    a=27
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))