11from abc import ABC , abstractmethod
22from asyncio import iscoroutine
3- from typing import Awaitable , Callable , Generic , Iterable , TypeVar , Union , cast
3+ from typing import (Awaitable , Callable , Generic , Iterable , List , TypeVar ,
4+ Union , cast )
45
56from .immutable import Immutable
6- from .monad import Monad , sequence_
7+ from .monad import Monad
78
89A = TypeVar ('A' , covariant = True )
910B = TypeVar ('B' )
@@ -127,7 +128,7 @@ async def thunk():
127128 return AndThen (self .sub , cont )
128129
129130
130- def sequence (iterable : Iterable [Trampoline [A ]]) -> Trampoline [Iterable [A ]]:
131+ def sequence (iterable : Iterable [Trampoline [B ]]) -> Trampoline [Iterable [B ]]:
131132 """
132133 Evaluate each :class:`Trampoline` in `iterable` from left to right
133134 and collect the results
@@ -139,7 +140,18 @@ def sequence(iterable: Iterable[Trampoline[A]]) -> Trampoline[Iterable[A]]:
139140 :param iterable: The iterable to collect results from
140141 :returns: ``Trampoline`` of collected results
141142 """
142- return cast (Trampoline [Iterable [A ]], sequence_ (Done , iterable ))
143+ def combine (rs : Trampoline [List [B ]],
144+ t : Trampoline [B ]) -> Trampoline [List [B ]]:
145+ return rs .and_then (
146+ lambda xs : t .map (
147+ lambda x : (xs .append (x ), xs )[1 ] # type: ignore
148+ )
149+ )
150+
151+ result : Trampoline [List [B ]] = Done ([])
152+ for trampoline in iterable :
153+ result = combine (result , trampoline )
154+ return result .map (tuple )
143155
144156
145157__all__ = ['Trampoline' , 'Done' , 'sequence' , 'Call' , 'AndThen' ]
0 commit comments