-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

{-# OPTIONS_GHC -Wno-orphans #-}

module Lorentz.UStore.Instances
  ( ustoreFieldOps
  , ustoreSubmapOps
  ) where

import Prelude ((.))

import Lorentz.StoreClass
import Lorentz.UStore.Instr
import Lorentz.UStore.Types

ustoreFieldOps
  :: HasUField fname ftype templ
  => StoreFieldOps (UStore templ) fname ftype
ustoreFieldOps :: StoreFieldOps (UStore templ) fname ftype
ustoreFieldOps =
  StoreFieldOps :: forall k store (fname :: k) ftype.
(forall (s :: [*]). FieldRef fname -> (store : s) :-> (ftype : s))
-> (forall (s :: [*]).
    FieldRef fname -> (ftype : store : s) :-> (store : s))
-> StoreFieldOps store fname ftype
StoreFieldOps
  { sopToField :: forall (s :: [*]).
FieldRef fname -> (UStore templ : s) :-> (ftype : s)
sopToField = Label fname -> (UStore templ : s) :-> (ftype : s)
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (UStore store : s) :-> (GetUStoreField store name : s)
ustoreToField (Label fname -> (UStore templ : s) :-> (ftype : s))
-> (FieldName fname 'FieldRefTag -> Label fname)
-> FieldName fname 'FieldRefTag
-> (UStore templ : s) :-> (ftype : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName fname 'FieldRefTag -> Label fname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  , sopSetField :: forall (s :: [*]).
FieldRef fname -> (ftype : UStore templ : s) :-> (UStore templ : s)
sopSetField = Label fname -> (ftype : UStore templ : s) :-> (UStore templ : s)
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (GetUStoreField store name : UStore store : s)
   :-> (UStore store : s)
ustoreSetField (Label fname -> (ftype : UStore templ : s) :-> (UStore templ : s))
-> (FieldName fname 'FieldRefTag -> Label fname)
-> FieldName fname 'FieldRefTag
-> (ftype : UStore templ : s) :-> (UStore templ : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName fname 'FieldRefTag -> Label fname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  }

instance HasUField fname ftype templ =>
         StoreHasField (UStore templ) fname ftype where
  storeFieldOps :: StoreFieldOps (UStore templ) fname ftype
storeFieldOps = StoreFieldOps (UStore templ) fname ftype
forall (fname :: Symbol) ftype templ.
HasUField fname ftype templ =>
StoreFieldOps (UStore templ) fname ftype
ustoreFieldOps

ustoreSubmapOps
  :: HasUStore mname key value templ
  => StoreSubmapOps (UStore templ) mname key value
ustoreSubmapOps :: StoreSubmapOps (UStore templ) mname key value
ustoreSubmapOps = StoreSubmapOps :: forall k store (mname :: k) key value.
(forall (s :: [*]).
 FieldRef mname -> (key : store : s) :-> (Bool : s))
-> (forall (s :: [*]).
    KnownValue value =>
    FieldRef mname -> (key : store : s) :-> (Maybe value : s))
-> (forall (s :: [*]).
    FieldRef mname -> (key : Maybe value : store : s) :-> (store : s))
-> (forall (s :: [*]).
    FieldRef mname -> (key : store : s) :-> (store : s))
-> (forall (s :: [*]).
    FieldRef mname -> (key : value : store : s) :-> (store : s))
-> StoreSubmapOps store mname key value
StoreSubmapOps
  { sopMem :: forall (s :: [*]).
FieldRef mname -> (key : UStore templ : s) :-> (Bool : s)
sopMem = Label mname -> (key : UStore templ : s) :-> (Bool : s)
forall store (name :: Symbol) (s :: [*]).
KeyAccessC store name =>
Label name
-> (GetUStoreKey store name : UStore store : s) :-> (Bool : s)
ustoreMem (Label mname -> (key : UStore templ : s) :-> (Bool : s))
-> (FieldName mname 'FieldRefTag -> Label mname)
-> FieldName mname 'FieldRefTag
-> (key : UStore templ : s) :-> (Bool : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName mname 'FieldRefTag -> Label mname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  , sopGet :: forall (s :: [*]).
KnownValue value =>
FieldRef mname -> (key : UStore templ : s) :-> (Maybe value : s)
sopGet = Label mname -> (key : UStore templ : s) :-> (Maybe value : s)
forall store (name :: Symbol) (s :: [*]).
(KeyAccessC store name, ValueAccessC store name) =>
Label name
-> (GetUStoreKey store name : UStore store : s)
   :-> (Maybe (GetUStoreValue store name) : s)
ustoreGet (Label mname -> (key : UStore templ : s) :-> (Maybe value : s))
-> (FieldName mname 'FieldRefTag -> Label mname)
-> FieldName mname 'FieldRefTag
-> (key : UStore templ : s) :-> (Maybe value : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName mname 'FieldRefTag -> Label mname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  , sopUpdate :: forall (s :: [*]).
FieldRef mname
-> (key : Maybe value : UStore templ : s) :-> (UStore templ : s)
sopUpdate = Label mname
-> (key : Maybe value : UStore templ : s) :-> (UStore templ : s)
forall store (name :: Symbol) (s :: [*]).
(KeyAccessC store name, ValueAccessC store name) =>
Label name
-> (GetUStoreKey store name
      : Maybe (GetUStoreValue store name) : UStore store : s)
   :-> (UStore store : s)
ustoreUpdate (Label mname
 -> (key : Maybe value : UStore templ : s) :-> (UStore templ : s))
-> (FieldName mname 'FieldRefTag -> Label mname)
-> FieldName mname 'FieldRefTag
-> (key : Maybe value : UStore templ : s) :-> (UStore templ : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName mname 'FieldRefTag -> Label mname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  , sopDelete :: forall (s :: [*]).
FieldRef mname -> (key : UStore templ : s) :-> (UStore templ : s)
sopDelete = Label mname -> (key : UStore templ : s) :-> (UStore templ : s)
forall store (name :: Symbol) (s :: [*]).
KeyAccessC store name =>
Label name
-> (GetUStoreKey store name : UStore store : s)
   :-> (UStore store : s)
ustoreDelete (Label mname -> (key : UStore templ : s) :-> (UStore templ : s))
-> (FieldName mname 'FieldRefTag -> Label mname)
-> FieldName mname 'FieldRefTag
-> (key : UStore templ : s) :-> (UStore templ : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName mname 'FieldRefTag -> Label mname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  , sopInsert :: forall (s :: [*]).
FieldRef mname
-> (key : value : UStore templ : s) :-> (UStore templ : s)
sopInsert = Label mname
-> (key : value : UStore templ : s) :-> (UStore templ : s)
forall store (name :: Symbol) (s :: [*]).
(KeyAccessC store name, ValueAccessC store name) =>
Label name
-> (GetUStoreKey store name
      : GetUStoreValue store name : UStore store : s)
   :-> (UStore store : s)
ustoreInsert (Label mname
 -> (key : value : UStore templ : s) :-> (UStore templ : s))
-> (FieldName mname 'FieldRefTag -> Label mname)
-> FieldName mname 'FieldRefTag
-> (key : value : UStore templ : s) :-> (UStore templ : s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName mname 'FieldRefTag -> Label mname
forall (n :: Symbol). FieldSymRef n -> Label n
fieldNameToLabel
  }

instance {-# OVERLAPPING #-}
         HasUStore mname key value templ =>
         StoreHasSubmap (UStore templ) mname key value where
  storeSubmapOps :: StoreSubmapOps (UStore templ) mname key value
storeSubmapOps = StoreSubmapOps (UStore templ) mname key value
forall (mname :: Symbol) key value templ.
HasUStore mname key value templ =>
StoreSubmapOps (UStore templ) mname key value
ustoreSubmapOps