Cooperative Multitasking (Asynchronous) Paradigm#

Initial Set Up#

from typing import Generator, Optional
import itertools

def repeat(a: int):
    while True:
        yield a

Predecessor and Successor#

def predecessor(a: int) -> Generator[int, None, None]:
    while a >= 0:
        a -= 1
        yield a


assert next(predecessor(1)) == 0
assert next(predecessor(10)) == 9
def successor(a: int) -> Generator[int, None, None]:
    while True:
        a += 1
        yield a


assert next(successor(0)) == 1
assert next(successor(10)) == 11

Addition#

import itertools

def addition(addend_1: int, addend_2: int) -> Generator[int, None, None]:
    successor_ = successor(addend_1)    
    result = addend_1
    while True:
        for _ in range(addend_2):
            result = next(successor_)
        yield result


assert next(addition(0, 0)) == 0
assert next(addition(1, 0)) == 1
assert next(addition(0, 1)) == 1
assert next(addition(10, 10)) == 20

Multiplication#

def multiplication(multiplicand: int, multiplier: int) -> Generator[int, None, None]:
    if multiplicand == 0 or multiplier == 0:
        yield from repeat(0)
        
    addition_ = addition(0, multiplier)
    result = multiplicand
    while True:
        for _ in range(multiplier):
            result = next(addition_)
        yield result


assert next(multiplication(0, 0)) == 0
assert next(multiplication(2, 0)) == 0
assert next(multiplication(0, 2)) == 0
assert next(multiplication(10, 10)) == 100

Exponentiation#

def exponentiation(base: int, exponent: int) -> Generator[int, None, None]:
    if base == 0:
        yield from repeat(0)

    if exponent == 0:
        yield from repeat(1)

    multiplication_ = multiplication(base, exponent)
    result = 1
    while True:
        for _ in range(exponent):
            result = next(multiplication_)
        yield result


assert next(exponentiation(1, 0)) == 1
assert next(exponentiation(0, 1)) == 0
assert next(exponentiation(3, 3)) == 27