module Database.Drasil.TypedUIDRef (
  TypedUIDRef, mkRef,
  typedFind, typedFindOrErr,
) where

import Data.Maybe (fromMaybe)
import Drasil.Database.Chunk (IsChunk)
import Drasil.Database.TypedUIDRef (TypedUIDRef(..), mkRef)
import Database.Drasil.ChunkDB (ChunkDB, find)

-- | Find a chunk by its typed UID reference.
typedFind :: IsChunk t => TypedUIDRef t -> ChunkDB -> Maybe t
typedFind :: forall t. IsChunk t => TypedUIDRef t -> ChunkDB -> Maybe t
typedFind (TypedUIDRef UID
u) = UID -> ChunkDB -> Maybe t
forall a. Typeable a => UID -> ChunkDB -> Maybe a
find UID
u

-- | Find a chunk by its typed UID reference, erroring if not found.
typedFindOrErr :: IsChunk t => TypedUIDRef t -> ChunkDB -> t
typedFindOrErr :: forall t. IsChunk t => TypedUIDRef t -> ChunkDB -> t
typedFindOrErr TypedUIDRef t
tu ChunkDB
cdb = t -> Maybe t -> t
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> t
forall a. HasCallStack => [Char] -> a
error [Char]
"Typed UID dereference failed.") (TypedUIDRef t -> ChunkDB -> Maybe t
forall t. IsChunk t => TypedUIDRef t -> ChunkDB -> Maybe t
typedFind TypedUIDRef t
tu ChunkDB
cdb)