feat: optional

This commit is contained in:
orion 2023-12-19 16:14:34 -06:00
parent 80e264e7c6
commit 9924a2ec59
Signed by: orion
GPG Key ID: 6D4165AE4C928719

View File

@ -5,8 +5,9 @@ import Prelude
import Control.Monad.Error.Class (liftMaybe) import Control.Monad.Error.Class (liftMaybe)
import Data.Array as Array import Data.Array as Array
import Data.Either (Either) import Data.Either (Either)
import Data.Maybe (fromMaybe) import Data.Maybe (Maybe, fromMaybe, isJust)
import Data.Postgres.Types (RawRow(..)) import Data.Postgres.Types (RawRow(..))
import Data.Traversable (sequence, traverse)
import Database.PostgreSQL (class FromSQLValue, fromSQLValue) import Database.PostgreSQL (class FromSQLValue, fromSQLValue)
import Foreign (Foreign) import Foreign (Foreign)
import Prim.Row (class Cons, class Lacks) import Prim.Row (class Cons, class Lacks)
@ -16,6 +17,15 @@ import Type.Prelude (class IsSymbol, Proxy(..))
data ExtractRecord a = ExtractRecord (Array Foreign) a data ExtractRecord a = ExtractRecord (Array Foreign) a
instance Functor ExtractRecord where
map f (ExtractRecord rs a) = ExtractRecord rs (f a)
instance Apply ExtractRecord where
apply (ExtractRecord _ f) (ExtractRecord rs a) = ExtractRecord rs (f a)
instance Applicative ExtractRecord where
pure a = ExtractRecord [] a
extract :: forall a. (ExtractRecord {} -> Either String $ ExtractRecord a) -> RawRow -> Either String a extract :: forall a. (ExtractRecord {} -> Either String $ ExtractRecord a) -> RawRow -> Either String a
extract f = map finish <<< f <<< start extract f = map finish <<< f <<< start
@ -43,3 +53,21 @@ field (ExtractRecord row r) = do
col <- liftMaybe eempty $ Array.head row col <- liftMaybe eempty $ Array.head row
val <- fromSQLValue col val <- fromSQLValue col
pure $ skip $ ExtractRecord row $ Record.insert (Proxy @k) val r pure $ skip $ ExtractRecord row $ Record.insert (Proxy @k) val r
optional
:: forall a b @k @v
. Show (Record a)
=> Lacks k a
=> Cons k v a b
=> IsSymbol k
=> FromSQLValue (Maybe v)
=> ExtractRecord $ Record a
-> Either String $ ExtractRecord $ Maybe $ Record b
optional (ExtractRecord row r) = do
let
col = Array.head row
skip' = if isJust col then skip else identity
val :: Maybe v <- map join $ traverse fromSQLValue col
pure
$ sequence
$ map (\v -> skip' $ ExtractRecord row $ Record.insert (Proxy @k) v r) val