Merge pull request #1 from BeFunctional/edsko/pure-and-io-versions

Distinguish between IO and pure functions
This commit is contained in:
Edsko de Vries 2023-03-20 13:01:15 +00:00 committed by GitHub
commit ad7043bb75
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 11 deletions

View file

@ -1,6 +1,6 @@
# This GitHub workflow config has been generated by a script via # This GitHub workflow config has been generated by a script via
# #
# haskell-ci 'github' 'cabal.project' # haskell-ci 'github' '--no-cabal-check' 'cabal.project'
# #
# To regenerate the script (for example after adjusting tested-with) run # To regenerate the script (for example after adjusting tested-with) run
# #
@ -10,7 +10,7 @@
# #
# version: 0.15.20230312 # version: 0.15.20230312
# #
# REGENDATA ("0.15.20230312",["github","cabal.project"]) # REGENDATA ("0.15.20230312",["github","--no-cabal-check","cabal.project"])
# #
name: Haskell-CI name: Haskell-CI
on: on:
@ -214,10 +214,6 @@ jobs:
- name: tests - name: tests
run: | run: |
$CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct
- name: cabal check
run: |
cd ${PKGDIR_foreign_rust} || false
${CABAL} -vnormal check
- name: haddock - name: haddock
run: | run: |
$CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all

View file

@ -13,6 +13,10 @@ module Foreign.Rust.Marshall.Variable (
, withBorshVarBuffer , withBorshVarBuffer
, withBorshMaxBuffer , withBorshMaxBuffer
, withBorshFailure , withBorshFailure
-- ** Pure variants
, withPureBorshVarBuffer
, withPureBorshMaxBuffer
, withPureBorshFailure
) where ) where
import Codec.Borsh import Codec.Borsh
@ -66,7 +70,7 @@ withBorshVarBuffer :: forall a.
, StaticBorshSize a ~ 'HasVariableSize , StaticBorshSize a ~ 'HasVariableSize
, Typeable a , Typeable a
) )
=> (Buffer a -> IO ()) -> a => (Buffer a -> IO ()) -> IO a
withBorshVarBuffer = withBorshBufferOfInitSize 1024 withBorshVarBuffer = withBorshBufferOfInitSize 1024
withBorshMaxBuffer :: forall a. withBorshMaxBuffer :: forall a.
@ -75,7 +79,7 @@ withBorshMaxBuffer :: forall a.
, BorshMaxSize a , BorshMaxSize a
, Typeable a , Typeable a
) )
=> (Buffer a -> IO ()) -> a => (Buffer a -> IO ()) -> IO a
withBorshMaxBuffer = withBorshMaxBuffer =
withBorshBufferOfInitSize initBufSize withBorshBufferOfInitSize initBufSize
where where
@ -89,8 +93,39 @@ withBorshFailure :: forall a.
, Typeable a , Typeable a
, HasCallStack , 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 => (Buffer (Either Text a) -> IO ()) -> Either Failure a
withBorshFailure = first mkFailure . withBorshVarBuffer withPureBorshFailure = unsafePerformIO . withBorshFailure
{------------------------------------------------------------------------------- {-------------------------------------------------------------------------------
Internal auxiliary Internal auxiliary
@ -102,8 +137,8 @@ withBorshBufferOfInitSize :: forall a.
, StaticBorshSize a ~ 'HasVariableSize , StaticBorshSize a ~ 'HasVariableSize
, Typeable a , Typeable a
) )
=> CULong -> (Buffer a -> IO ()) -> a => CULong -> (Buffer a -> IO ()) -> IO a
withBorshBufferOfInitSize initBufSize f = unsafePerformIO $ do withBorshBufferOfInitSize initBufSize f = do
mFirstAttempt <- allocaBytes (culongToInt initBufSize) $ \buf -> do mFirstAttempt <- allocaBytes (culongToInt initBufSize) $ \buf -> do
(bigEnough, reqSz) <- callWithSize buf initBufSize (bigEnough, reqSz) <- callWithSize buf initBufSize
if bigEnough then if bigEnough then