diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-18 16:52:41 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-25 21:27:38 +0100 |
| commit | 0bb8daa7da52240a971a4ce83d97cfb62971ea78 (patch) | |
| tree | 8e91ebd75f442384f2af4648847c2fdfe919f0b1 /src/crypto/reflibs/Crypto/Error.hs | |
| parent | e45b366ca8b9caa4fe0087e5c4fb1720472d9c23 (diff) | |
Diffstat (limited to 'src/crypto/reflibs/Crypto/Error.hs')
| -rw-r--r-- | src/crypto/reflibs/Crypto/Error.hs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/crypto/reflibs/Crypto/Error.hs b/src/crypto/reflibs/Crypto/Error.hs new file mode 100644 index 0000000..8f03db7 --- /dev/null +++ b/src/crypto/reflibs/Crypto/Error.hs @@ -0,0 +1,41 @@ +module Crypto.Error ( + CryptoError(..), + CryptoFailable(..), + + throwCryptoErrorIO, + maybeCryptoError, +) where + +import Control.Exception +import Control.Monad + + +data CryptoError = CryptoError + deriving (Show) + +instance Exception CryptoError + +data CryptoFailable a + = CryptoPassed a + | CryptoFailed CryptoError + deriving (Show) + +instance Functor CryptoFailable where + fmap f (CryptoPassed x) = CryptoPassed (f x) + fmap _ (CryptoFailed e) = CryptoFailed e + +instance Applicative CryptoFailable where + pure = CryptoPassed + (<*>) = ap + +instance Monad CryptoFailable where + CryptoPassed x >>= f = f x + CryptoFailed e >>= _ = CryptoFailed e + +throwCryptoErrorIO :: CryptoFailable a -> IO a +throwCryptoErrorIO (CryptoPassed r) = return r +throwCryptoErrorIO (CryptoFailed e) = throwIO e + +maybeCryptoError :: CryptoFailable a -> Maybe a +maybeCryptoError (CryptoPassed x) = Just x +maybeCryptoError (CryptoFailed _) = Nothing |