@@ -38,7 +38,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
3838
3939from collections import abc
4040from dataclasses import dataclass
41- from typing import TypeVar, Generic, Callable, Any, Tuple, List, Iterable, Union
41+ from typing import TypeVar, Generic, Callable, Any, Tuple, List, Iterable
4242
4343from typing_extensions import final
4444
@@ -48,7 +48,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
4848from raffiot._internal import IOTag
4949from raffiot.io import IO
5050from raffiot.result import Result, Ok, Errors, Panic
51- from raffiot.utils import ComputationStatus, MatchError
51+ from raffiot.utils import ComputationStatus, MatchError, TracedException
5252
5353__all__ = [
5454 "Resource",
@@ -178,7 +178,11 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
178178 return io.pure((f(a), close))
179179 except Exception as exception:
180180 return close_and_merge_failure(
181- close, Panic(exceptions=[exception], errors=[])
181+ close,
182+ Panic(
183+ exceptions=[TracedException.in_except_clause(exception)],
184+ errors=[],
185+ ),
182186 )
183187
184188 return Resource(self.create.flat_map(safe_map))
@@ -307,7 +311,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
307311 # Panic
308312
309313 def recover(
310- self, handler: Callable[[List[Exception ], List[E]], Resource[R, E, A]]
314+ self, handler: Callable[[List[TracedException ], List[E]], Resource[R, E, A]]
311315 ) -> Resource[R, E, A]:
312316 """
313317 React to panics (the except part of a try-except).
@@ -316,7 +320,9 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
316320 """
317321 return Resource(self.create.recover(lambda p, e: handler(p, e).create))
318322
319- def map_panic(self, f: Callable[[Exception], Exception]) -> Resource[R, E, A]:
323+ def map_panic(
324+ self, f: Callable[[TracedException], TracedException]
325+ ) -> Resource[R, E, A]:
320326 """
321327 Transform the exceptions stored if the computation fails on a panic.
322328 Do nothing otherwise.
@@ -474,7 +480,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
474480 return Resource(io.error(err))
475481
476482
477- def errors(*errs: Union[E, Iterable[E]] ) -> Resource[R, E, A]:
483+ def errors(*errs: E ) -> Resource[R, E, A]:
478484 """
479485 Resource creation that always fails on the errors err.
480486 """
@@ -487,9 +493,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
487493 return Resource(io.errors(errs))
488494
489495
490- def panic(
491- *exceptions: Union[Exception, Iterable[Exception]], errors: List[E] = None
492- ) -> Resource[R, E, A]:
496+ def panic(*exceptions: TracedException, errors: List[E] = None) -> Resource[R, E, A]:
493497 """
494498 Resource creation that always fails with the panic exceptions.
495499 """
@@ -515,7 +519,9 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
515519 return errors(r.errors)
516520 if isinstance(r, Panic):
517521 return panic(r.exceptions, errors=r.errors)
518- return panic(MatchError(f"{r} should be a Result"))
522+ return panic(
523+ TracedException.with_stack_trace(MatchError(f"{r} should be a Result"))
524+ )
519525
520526
521527def from_io_resource(mio: IO[R, E, Resource[R, E, A]]) -> Resource[R, E, A]:
@@ -568,9 +574,7 @@ <h1 class="title">Module <code>raffiot.resource</code></h1>
568574 return Resource(the_io.map(manager_handler))
569575
570576
571- def zip(
572- *rs: Union[Resource[R, E, A], Iterable[Resource[R, E, A]]]
573- ) -> Resource[R, E, List[A]]:
577+ def zip(*rs: Resource[R, E, A]) -> Resource[R, E, List[A]]:
574578 """
575579 Transform a list of Resource into a Resource creating a list
576580 of all resources.
@@ -1004,15 +1008,15 @@ <h2 class="section-title" id="header-functions">Functions</h2>
10041008</ details >
10051009</ dd >
10061010< dt id ="raffiot.resource.errors "> < code class ="name flex ">
1007- < span > def < span class ="ident "> errors</ span > </ span > (< span > *errs: Union[E, Iterable[E]] ) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
1011+ < span > def < span class ="ident "> errors</ span > </ span > (< span > *errs: E ) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
10081012</ code > </ dt >
10091013< dd >
10101014< div class ="desc "> < p > Resource creation that always fails on the errors err.</ p > </ div >
10111015< details class ="source ">
10121016< summary >
10131017< span > Expand source code</ span >
10141018</ summary >
1015- < pre > < code class ="python "> def errors(*errs: Union[E, Iterable[E]] ) -> Resource[R, E, A]:
1019+ < pre > < code class ="python "> def errors(*errs: E ) -> Resource[R, E, A]:
10161020 """
10171021 Resource creation that always fails on the errors err.
10181022 """
@@ -1104,7 +1108,9 @@ <h2 class="section-title" id="header-functions">Functions</h2>
11041108 return errors(r.errors)
11051109 if isinstance(r, Panic):
11061110 return panic(r.exceptions, errors=r.errors)
1107- return panic(MatchError(f"{r} should be a Result"))</ code > </ pre >
1111+ return panic(
1112+ TracedException.with_stack_trace(MatchError(f"{r} should be a Result"))
1113+ )</ code > </ pre >
11081114</ details >
11091115</ dd >
11101116< dt id ="raffiot.resource.from_with "> < code class ="name flex ">
@@ -1183,17 +1189,15 @@ <h2 class="section-title" id="header-functions">Functions</h2>
11831189</ details >
11841190</ dd >
11851191< dt id ="raffiot.resource.panic "> < code class ="name flex ">
1186- < span > def < span class ="ident "> panic</ span > </ span > (< span > *exceptions: Union[Exception, Iterable[Exception]] , errors: List[E] = None) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
1192+ < span > def < span class ="ident "> panic</ span > </ span > (< span > *exceptions: TracedException , errors: List[E] = None) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
11871193</ code > </ dt >
11881194< dd >
11891195< div class ="desc "> < p > Resource creation that always fails with the panic exceptions.</ p > </ div >
11901196< details class ="source ">
11911197< summary >
11921198< span > Expand source code</ span >
11931199</ summary >
1194- < pre > < code class ="python "> def panic(
1195- *exceptions: Union[Exception, Iterable[Exception]], errors: List[E] = None
1196- ) -> Resource[R, E, A]:
1200+ < pre > < code class ="python "> def panic(*exceptions: TracedException, errors: List[E] = None) -> Resource[R, E, A]:
11971201 """
11981202 Resource creation that always fails with the panic exceptions.
11991203 """
@@ -1341,7 +1345,7 @@ <h2 class="section-title" id="header-functions">Functions</h2>
13411345</ details >
13421346</ dd >
13431347< dt id ="raffiot.resource.zip "> < code class ="name flex ">
1344- < span > def < span class ="ident "> zip</ span > </ span > (< span > *rs: Union[ < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [R, E, A], Iterable[ < a title =" raffiot.resource.Resource " href =" #raffiot.resource.Resource " > Resource </ a > [R, E, A]] ]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, typing.List[~A]]</ span >
1348+ < span > def < span class ="ident "> zip</ span > </ span > (< span > *rs: < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [R, E, A]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, typing.List[~A]]</ span >
13451349</ code > </ dt >
13461350< dd >
13471351< div class ="desc "> < p > Transform a list of Resource into a Resource creating a list
@@ -1354,9 +1358,7 @@ <h2 class="section-title" id="header-functions">Functions</h2>
13541358< summary >
13551359< span > Expand source code</ span >
13561360</ summary >
1357- < pre > < code class ="python "> def zip(
1358- *rs: Union[Resource[R, E, A], Iterable[Resource[R, E, A]]]
1359- ) -> Resource[R, E, List[A]]:
1361+ < pre > < code class ="python "> def zip(*rs: Resource[R, E, A]) -> Resource[R, E, List[A]]:
13601362 """
13611363 Transform a list of Resource into a Resource creating a list
13621364 of all resources.
@@ -1543,7 +1545,11 @@ <h2 class="section-title" id="header-classes">Classes</h2>
15431545 return io.pure((f(a), close))
15441546 except Exception as exception:
15451547 return close_and_merge_failure(
1546- close, Panic(exceptions=[exception], errors=[])
1548+ close,
1549+ Panic(
1550+ exceptions=[TracedException.in_except_clause(exception)],
1551+ errors=[],
1552+ ),
15471553 )
15481554
15491555 return Resource(self.create.flat_map(safe_map))
@@ -1672,7 +1678,7 @@ <h2 class="section-title" id="header-classes">Classes</h2>
16721678 # Panic
16731679
16741680 def recover(
1675- self, handler: Callable[[List[Exception ], List[E]], Resource[R, E, A]]
1681+ self, handler: Callable[[List[TracedException ], List[E]], Resource[R, E, A]]
16761682 ) -> Resource[R, E, A]:
16771683 """
16781684 React to panics (the except part of a try-except).
@@ -1681,7 +1687,9 @@ <h2 class="section-title" id="header-classes">Classes</h2>
16811687 """
16821688 return Resource(self.create.recover(lambda p, e: handler(p, e).create))
16831689
1684- def map_panic(self, f: Callable[[Exception], Exception]) -> Resource[R, E, A]:
1690+ def map_panic(
1691+ self, f: Callable[[TracedException], TracedException]
1692+ ) -> Resource[R, E, A]:
16851693 """
16861694 Transform the exceptions stored if the computation fails on a panic.
16871695 Do nothing otherwise.
@@ -2011,7 +2019,11 @@ <h3>Methods</h3>
20112019 return io.pure((f(a), close))
20122020 except Exception as exception:
20132021 return close_and_merge_failure(
2014- close, Panic(exceptions=[exception], errors=[])
2022+ close,
2023+ Panic(
2024+ exceptions=[TracedException.in_except_clause(exception)],
2025+ errors=[],
2026+ ),
20152027 )
20162028
20172029 return Resource(self.create.flat_map(safe_map))</ code > </ pre >
@@ -2040,7 +2052,7 @@ <h3>Methods</h3>
20402052</ details >
20412053</ dd >
20422054< dt id ="raffiot.resource.Resource.map_panic "> < code class ="name flex ">
2043- < span > def < span class ="ident "> map_panic</ span > </ span > (< span > self, f: Callable[[Exception ], Exception ]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
2055+ < span > def < span class ="ident "> map_panic</ span > </ span > (< span > self, f: Callable[[TracedException ], TracedException ]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
20442056</ code > </ dt >
20452057< dd >
20462058< div class ="desc "> < p > Transform the exceptions stored if the computation fails on a panic.
@@ -2049,7 +2061,9 @@ <h3>Methods</h3>
20492061< summary >
20502062< span > Expand source code</ span >
20512063</ summary >
2052- < pre > < code class ="python "> def map_panic(self, f: Callable[[Exception], Exception]) -> Resource[R, E, A]:
2064+ < pre > < code class ="python "> def map_panic(
2065+ self, f: Callable[[TracedException], TracedException]
2066+ ) -> Resource[R, E, A]:
20532067 """
20542068 Transform the exceptions stored if the computation fails on a panic.
20552069 Do nothing otherwise.
@@ -2099,7 +2113,7 @@ <h3>Methods</h3>
20992113</ details >
21002114</ dd >
21012115< dt id ="raffiot.resource.Resource.recover "> < code class ="name flex ">
2102- < span > def < span class ="ident "> recover</ span > </ span > (< span > self, handler: Callable[[List[Exception ], List[E]], < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [R, E, A]]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
2116+ < span > def < span class ="ident "> recover</ span > </ span > (< span > self, handler: Callable[[List[TracedException ], List[E]], < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [R, E, A]]) ‑> < a title ="raffiot.resource.Resource " href ="#raffiot.resource.Resource "> Resource</ a > [~R, ~E, ~A]</ span >
21032117</ code > </ dt >
21042118< dd >
21052119< div class ="desc "> < p > React to panics (the except part of a try-except).</ p >
@@ -2109,7 +2123,7 @@ <h3>Methods</h3>
21092123< span > Expand source code</ span >
21102124</ summary >
21112125< pre > < code class ="python "> def recover(
2112- self, handler: Callable[[List[Exception ], List[E]], Resource[R, E, A]]
2126+ self, handler: Callable[[List[TracedException ], List[E]], Resource[R, E, A]]
21132127) -> Resource[R, E, A]:
21142128 """
21152129 React to panics (the except part of a try-except).
0 commit comments