from __future__ import annotations
import typing
from metadsl import *
from metadsl_rewrite import *
from .strategies import *
__all__ = ["Pair"]
T = typing.TypeVar("T")
U = typing.TypeVar("U")
V = typing.TypeVar("V")
[docs]class Pair(Expression, typing.Generic[T, U]):
[docs] @expression # type: ignore
@property
def left(self) -> T:
...
[docs] @expression # type: ignore
@property
def right(self) -> U:
...
[docs] @expression
def set_left(self, left: T) -> Pair[T, U]:
...
[docs] @expression
def set_right(self, right: U) -> Pair[T, U]:
...
[docs] @expression
@classmethod
def create(cls, left: T, right: U) -> Pair[T, U]:
...
@property
def spread(self) -> typing.Tuple[T, U]:
return self.left, self.right
@register_core # type: ignore
@rule
def pair_left(l: T, r: U) -> R[T]:
"""
>>> execute(Pair.create(10, 20).left)
10
"""
return Pair.create(l, r).left, l
@register_core # type: ignore
@rule
def pair_right(l: T, r: U) -> R[U]:
"""
>>> execute(Pair.create(10, 20).right)
20
"""
return Pair.create(l, r).right, r
@register_core # type: ignore
@rule
def pair_set(l: T, r: U, new_l: T, new_r: U) -> R[Pair[T, U]]:
"""
>>> execute(Pair.create(10, 20).set_left(5).left)
5
>>> execute(Pair.create(10, 20).set_left(5).right)
20
>>> execute(Pair.create(10, 20).set_right(5).left)
10
>>> execute(Pair.create(10, 20).set_right(5).right)
5
"""
yield Pair.create(l, r).set_left(new_l), Pair.create(new_l, r)
yield Pair.create(l, r).set_right(new_r), Pair.create(l, new_r)