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
#
# haskell-ci 'github' 'cabal.project'
# haskell-ci 'github' '--no-cabal-check' 'cabal.project'
#
# To regenerate the script (for example after adjusting tested-with) run
#
@ -10,7 +10,7 @@
#
# version: 0.15.20230312
#
# REGENDATA ("0.15.20230312",["github","cabal.project"])
# REGENDATA ("0.15.20230312",["github","--no-cabal-check","cabal.project"])
#
name: Haskell-CI
on:
@ -214,10 +214,6 @@ jobs:
- name: tests
run: |
$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
run: |
$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
, 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