From b9e13b0dbde5e91261333c808b408c77e7be7141 Mon Sep 17 00:00:00 2001 From: Edsko de Vries Date: Mon, 20 Mar 2023 12:36:23 +0100 Subject: [PATCH] Distinguish between IO and pure functions --- src/Foreign/Rust/Marshall/Variable.hs | 45 ++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/Foreign/Rust/Marshall/Variable.hs b/src/Foreign/Rust/Marshall/Variable.hs index 25e8465..a84b591 100644 --- a/src/Foreign/Rust/Marshall/Variable.hs +++ b/src/Foreign/Rust/Marshall/Variable.hs @@ -13,6 +13,10 @@ module Foreign.Rust.Marshall.Variable ( , withBorshVarBuffer , withBorshMaxBuffer , withBorshFailure + -- ** Pure variants + , withPureBorshVarBuffer + , withPureBorshMaxBuffer + , withPureBorshFailure ) where import Codec.Borsh @@ -66,7 +70,7 @@ withBorshVarBuffer :: forall a. , StaticBorshSize a ~ 'HasVariableSize , Typeable a ) - => (Buffer a -> IO ()) -> a + => (Buffer a -> IO ()) -> IO a withBorshVarBuffer = withBorshBufferOfInitSize 1024 withBorshMaxBuffer :: forall a. @@ -75,7 +79,7 @@ withBorshMaxBuffer :: forall a. , BorshMaxSize a , Typeable a ) - => (Buffer a -> IO ()) -> a + => (Buffer a -> IO ()) -> IO a withBorshMaxBuffer = withBorshBufferOfInitSize initBufSize where @@ -89,8 +93,39 @@ withBorshFailure :: forall a. , Typeable a , HasCallStack ) + => (Buffer (Either Text a) -> IO ()) -> IO (Either Failure a) +withBorshFailure = fmap (first mkFailure) . withBorshVarBuffer + +{------------------------------------------------------------------------------- + Pure variants +-------------------------------------------------------------------------------} + +withPureBorshVarBuffer :: forall a. + ( FromBorsh a + , StaticBorshSize a ~ 'HasVariableSize + , Typeable a + ) + => (Buffer a -> IO ()) -> a +withPureBorshVarBuffer = unsafePerformIO . withBorshVarBuffer + +withPureBorshMaxBuffer :: forall a. + ( FromBorsh a + , StaticBorshSize a ~ 'HasVariableSize + , BorshMaxSize a + , Typeable a + ) + => (Buffer a -> IO ()) -> a +withPureBorshMaxBuffer = unsafePerformIO . withBorshMaxBuffer + +withPureBorshFailure :: forall a. + ( FromBorsh a + , StaticBorshSize a ~ 'HasVariableSize + , Typeable a + , HasCallStack + ) => (Buffer (Either Text a) -> IO ()) -> Either Failure a -withBorshFailure = first mkFailure . withBorshVarBuffer +withPureBorshFailure = unsafePerformIO . withBorshFailure + {------------------------------------------------------------------------------- Internal auxiliary @@ -102,8 +137,8 @@ withBorshBufferOfInitSize :: forall a. , StaticBorshSize a ~ 'HasVariableSize , Typeable a ) - => CULong -> (Buffer a -> IO ()) -> a -withBorshBufferOfInitSize initBufSize f = unsafePerformIO $ do + => CULong -> (Buffer a -> IO ()) -> IO a +withBorshBufferOfInitSize initBufSize f = do mFirstAttempt <- allocaBytes (culongToInt initBufSize) $ \buf -> do (bigEnough, reqSz) <- callWithSize buf initBufSize if bigEnough then