module Hasql.Core.DecodeResult where
import Hasql.Prelude
import Hasql.Core.Model
import qualified Hasql.Core.InterpretResponses as A
import qualified Hasql.Core.DecodeRow as B
import qualified Control.Foldl as C
import qualified Data.HashMap.Strict as L
newtype DecodeResult result =
DecodeResult (ReaderT Bool A.InterpretResponses result)
deriving (Functor)
ignore :: DecodeResult ()
ignore =
DecodeResult (ReaderT (const (pure ())))
length :: DecodeResult Int
length =
DecodeResult (ReaderT (const (A.rowsAffected)))
head :: B.DecodeRow row -> DecodeResult row
head (B.DecodeRow (ReaderT parseDataRow)) =
DecodeResult (ReaderT (\idt -> A.singleRow (parseDataRow idt)))
headIfExists :: B.DecodeRow row -> DecodeResult (Maybe row)
headIfExists =
fmap fst . foldRows C.head
vector :: B.DecodeRow row -> DecodeResult (Vector row)
vector =
fmap fst . foldRows C.vector
list :: B.DecodeRow row -> DecodeResult [row]
list =
fmap fst . foldRows C.list
revList :: B.DecodeRow row -> DecodeResult [row]
revList =
fmap fst . foldRows C.revList
hashMap :: (Eq key, Hashable key) => B.DecodeRow (key, value) -> DecodeResult (HashMap key value)
hashMap decodeRow =
fmap fst (foldRows (C.Fold (\m (k, v) -> L.insert k v m) L.empty id) decodeRow)
foldRows :: Fold row result -> B.DecodeRow row -> DecodeResult (result, Int)
foldRows fold =
foldMRows (C.generalize fold)
foldMRows :: FoldM IO row result -> B.DecodeRow row -> DecodeResult (result, Int)
foldMRows fold (B.DecodeRow (ReaderT parseDataRow)) =
DecodeResult (ReaderT (\idt -> A.foldRows fold (parseDataRow idt)))