updade from Atlas repo

This commit is contained in:
Luciano Ramalho
2021-05-21 18:56:12 -03:00
parent c518bf851e
commit 8a330d822b
120 changed files with 2190 additions and 1184 deletions

View File

@@ -2,25 +2,25 @@ from typing import TypeVar, Generic
class Beverage:
"""Any beverage"""
"""Any beverage."""
class Juice(Beverage):
"""Any fruit juice"""
"""Any fruit juice."""
class OrangeJuice(Juice):
"""Delicious juice from Brazilian oranges"""
"""Delicious juice from Brazilian oranges."""
BeverageT = TypeVar('BeverageT', covariant=True)
T_co = TypeVar('T_co', covariant=True)
class BeverageDispenser(Generic[BeverageT]):
def __init__(self, beverage: BeverageT) -> None:
class BeverageDispenser(Generic[T_co]):
def __init__(self, beverage: T_co) -> None:
self.beverage = beverage
def dispense(self) -> BeverageT:
def dispense(self) -> T_co:
return self.beverage
@@ -36,11 +36,11 @@ class Compostable(Biodegradable):
"""Compostable garbage."""
GarbageT = TypeVar('GarbageT', contravariant=True)
T_contra = TypeVar('T_contra', contravariant=True)
class TrashCan(Generic[GarbageT]):
def put(self, trash) -> None:
class TrashCan(Generic[T_contra]):
def put(self, trash: T_contra) -> None:
"""Store trash until dumped..."""
@@ -48,35 +48,48 @@ class Cafeteria:
def __init__(
self,
dispenser: BeverageDispenser[Juice],
trash_can: TrashCan[Biodegradable]
trash_can: TrashCan[Biodegradable],
):
"""Initialize..."""
beverage_dispenser = BeverageDispenser(Beverage())
juice_dispenser = BeverageDispenser(Juice())
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
################################################ exact types
trash_can: TrashCan[Garbage] = TrashCan()
juice_dispenser = BeverageDispenser(Juice())
bio_can: TrashCan[Biodegradable] = TrashCan()
compost_can: TrashCan[Compostable] = TrashCan()
arnold_hall = Cafeteria(juice_dispenser, bio_can)
######################## covariance on 1st argument
arnold_hall = Cafeteria(orange_juice_dispenser, trash_can)
################################################ covariant dispenser
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
arnold_hall = Cafeteria(orange_juice_dispenser, bio_can)
################################################ non-covariant dispenser
beverage_dispenser = BeverageDispenser(Beverage())
## Argument 1 to "Cafeteria" has
## incompatible type "BeverageDispenser[Beverage]"
## expected "BeverageDispenser[Juice]"
# arnold_hall = Cafeteria(beverage_dispenser, trash_can)
# arnold_hall = Cafeteria(beverage_dispenser, bio_can)
######################## contravariance on 2nd argument
################################################ contravariant trash
trash_can: TrashCan[Garbage] = TrashCan()
arnold_hall = Cafeteria(juice_dispenser, trash_can)
################################################ non-contravariant trash
compost_can: TrashCan[Compostable] = TrashCan()
## Argument 2 to "Cafeteria" has
## incompatible type "TrashCan[Compostable]"
## expected "TrashCan[Biodegradable]"
# arnold_hall = Cafeteria(juice_dispenser, compost_can)
arnold_hall = Cafeteria(juice_dispenser, trash_can)

View File

@@ -29,14 +29,6 @@ class Box(Generic[T]):
return self.contents
T_contra = TypeVar('T_contra', contravariant=True)
class InBox(Generic[T_contra]):
def put(self, item: T) -> None:
self.contents = item
T_co = TypeVar('T_co', covariant=True)
@@ -46,3 +38,11 @@ class OutBox(Generic[T_co]):
def get(self) -> Any:
return self.contents
T_contra = TypeVar('T_contra', contravariant=True)
class InBox(Generic[T_contra]):
def put(self, item: T) -> None:
self.contents = item