Merge pull request #1 from BeFunctional/edsko/pure-and-io-versions
Distinguish between IO and pure functions
This commit is contained in:
commit
ad7043bb75
2 changed files with 42 additions and 11 deletions
8
.github/workflows/haskell-ci.yml
vendored
8
.github/workflows/haskell-ci.yml
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue