summaryrefslogtreecommitdiff
path: root/src/Erebos/Object/Internal.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-06-03 22:03:33 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-06-04 21:13:42 +0200
commit9fd045d5dd5a2d9b210847451fb6fc0837a00068 (patch)
treedce40a1726a3a2dd26589780553cabde59703b24 /src/Erebos/Object/Internal.hs
parent2f403246cb0eb4a0c39598f03cb2116ad00fc500 (diff)
Move Ref declaration to Object.Internal moduleHEADmaster
Diffstat (limited to 'src/Erebos/Object/Internal.hs')
-rw-r--r--src/Erebos/Object/Internal.hs34
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 =