diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-06-03 22:03:33 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-06-04 21:13:42 +0200 |
| commit | 9fd045d5dd5a2d9b210847451fb6fc0837a00068 (patch) | |
| tree | dce40a1726a3a2dd26589780553cabde59703b24 /src/Erebos/Object | |
| parent | 2f403246cb0eb4a0c39598f03cb2116ad00fc500 (diff) | |
Diffstat (limited to 'src/Erebos/Object')
| -rw-r--r-- | src/Erebos/Object/Internal.hs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/Erebos/Object/Internal.hs b/src/Erebos/Object/Internal.hs index 5c81bf5..b624d1c 100644 --- a/src/Erebos/Object/Internal.hs +++ b/src/Erebos/Object/Internal.hs @@ -1,8 +1,9 @@ module Erebos.Object.Internal ( Storage, PartialStorage, StorageCompleteness, - Ref, PartialRef, RefDigest, + Ref, PartialRef, RefDigest, Ref'(..), refDigest, refFromDigest, + refStorage, readRef, showRef, readRefDigest, showRefDigest, refDigestFromByteString, hashToRefDigest, @@ -59,6 +60,7 @@ import Data.ByteString.Lazy qualified as BL import Data.ByteString.Lazy.Char8 qualified as BLC import Data.Char import Data.Function +import Data.Hashable import Data.Maybe import Data.Ratio import Data.Text (Text) @@ -80,6 +82,33 @@ import Erebos.UUID qualified as U import Erebos.Util +data Ref' c = Ref (Storage' c) RefDigest + +type Ref = Ref' Complete +type PartialRef = Ref' Partial + +instance Eq (Ref' c) where + Ref _ d1 == Ref _ d2 = d1 == d2 + +instance Show (Ref' c) where + show ref@(Ref st _) = show st ++ ":" ++ BC.unpack (showRef ref) + +instance BA.ByteArrayAccess (Ref' c) where + length (Ref _ dgst) = BA.length dgst + withByteArray (Ref _ dgst) = BA.withByteArray dgst + +instance Hashable (Ref' c) where + hashWithSalt salt = hashWithSalt salt . refDigest + +refStorage :: Ref' c -> Storage' c +refStorage (Ref st _) = st + +refDigest :: Ref' c -> RefDigest +refDigest (Ref _ dgst) = dgst + +showRef :: Ref' c -> ByteString +showRef = showRefDigest . refDigest + zeroRef :: Storage' c -> Ref' c zeroRef s = Ref s (RefDigest h) where h = case digestFromByteString $ B.replicate (hashDigestSize $ digestAlgo h) 0 of @@ -257,6 +286,9 @@ lazyLoadBytes :: forall c. StorageCompleteness c => Ref' c -> LoadResult c BL.By lazyLoadBytes ref | isZeroRef ref = returnLoadResult (return BL.empty :: c BL.ByteString) lazyLoadBytes ref = returnLoadResult $ unsafePerformIO $ ioLoadBytes ref +ioLoadBytes :: StorageCompleteness c => Ref' c -> IO (c BL.ByteString) +ioLoadBytes (Ref st dgst) = unsafeLoadBytes st dgst + unsafeDeserializeObject :: Storage' c -> BL.ByteString -> Except ErebosError (Object' c, BL.ByteString) unsafeDeserializeObject _ bytes | BL.null bytes = return (ZeroObject, bytes) unsafeDeserializeObject st bytes = |