1 import Base 2 3 # Keeps the terminal cursor failure independent from owned error details. 4 type Failure is Data: 5 TextDecodeFailure{} 6 ReaderFailure{} 7 ResourceFailure{} 8 ArgumentFailure{} 9 10 # Classifies each failure without losing its public category. 11 type FailureClass is Data: 12 TextFailure{} 13 StorageFailure{} 14 ResourceLimitFailure{} 15 InvalidArgumentFailure{} 16 17 # Retains the terminal failure category across repeated cursor reads. 18 def classify(failure: Failure) -> FailureClass: 19 match failure: 20 case TextDecodeFailure{}: TextFailure{} 21 case ReaderFailure{}: StorageFailure{} 22 case ResourceFailure{}: ResourceLimitFailure{} 23 case ArgumentFailure{}: InvalidArgumentFailure{} 24 25 # Produces a stored cursor state and an output classification. 26 def duplicate(failure: Failure) -> Failure & Failure: 27 match failure: 28 case TextDecodeFailure{}: (TextDecodeFailure{}, TextDecodeFailure{}) 29 case ReaderFailure{}: (ReaderFailure{}, ReaderFailure{}) 30 case ResourceFailure{}: (ResourceFailure{}, ResourceFailure{}) 31 case ArgumentFailure{}: (ArgumentFailure{}, ArgumentFailure{})