module Composite.Opaleye.Update
( RecordToUpdate, recordToUpdate
) where
import Composite.Record ((:->)(Val), Rec((:&), RNil), Record)
import Data.Functor.Identity (Identity(Identity))
import Data.Kind (Type)
class RecordToUpdate (rs :: [Type]) (ss :: [Type]) where
recordToUpdate :: Record rs -> Record ss
instance RecordToUpdate '[] '[] where
recordToUpdate :: Record '[] -> Record '[]
recordToUpdate Record '[]
RNil = forall {u} (a :: u -> *). Rec a '[]
RNil
{-# INLINE recordToUpdate #-}
instance RecordToUpdate rs ss => RecordToUpdate (r ': rs) (r ': ss) where
recordToUpdate :: Record (r : rs) -> Record (r : ss)
recordToUpdate (Identity r
r :& Rec Identity rs
rs) = Identity r
r forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& forall (rs :: [*]) (ss :: [*]).
RecordToUpdate rs ss =>
Record rs -> Record ss
recordToUpdate Rec Identity rs
rs
{-# INLINE recordToUpdate #-}
instance RecordToUpdate rs ss => RecordToUpdate (s :-> a ': rs) (s :-> Maybe a ': ss) where
recordToUpdate :: Record ((s :-> a) : rs) -> Record ((s :-> Maybe a) : ss)
recordToUpdate (Identity (Val a
a) :& Rec Identity rs
rs) = forall a. a -> Identity a
Identity (forall (s :: Symbol) a. a -> s :-> a
Val (forall a. a -> Maybe a
Just a
a)) forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& forall (rs :: [*]) (ss :: [*]).
RecordToUpdate rs ss =>
Record rs -> Record ss
recordToUpdate Rec Identity rs
rs
{-# INLINE recordToUpdate #-}