libmdbx-0.1.0.0: app/Mdbx/Store.hs
module Mdbx.Store (
MdbxItemStore(..),
fromMdbxStore,
withMdbxStore
) where
import Data.ByteString.Unsafe (unsafeUseAsCStringLen, unsafePackCStringLen)
import Data.Coerce (coerce)
import Data.Store (Store, decodeIO, encode)
import Foreign.Ptr
import Mdbx
newtype MdbxItemStore a = MdbxItemStore {
unwrapStore :: a
}
instance Store a => MdbxItem (MdbxItemStore a) where
fromMdbxVal item = MdbxItemStore <$> fromMdbxStore item
toMdbxVal item = withMdbxStore (unwrapStore item)
fromMdbxStore :: Store v => MdbxVal -> IO v
fromMdbxStore (MdbxVal size ptr) = do
bs <- unsafePackCStringLen (castPtr ptr, fromIntegral size)
decodeIO bs
withMdbxStore :: Store v => v -> (MdbxVal -> IO a) -> IO a
withMdbxStore val fn =
unsafeUseAsCStringLen bsV $ \(ptrV, sizeV) -> do
let mval = MdbxVal (fromIntegral sizeV) (castPtr ptrV)
fn mval
where
bsV = encode val