{-# LANGUAGE UndecidableInstances #-}
module Database.Beam.Migrate.Generics.Types where

import           Database.Beam.Migrate.Types

import           Data.Proxy
import qualified Data.Text as T

import           GHC.Generics

class GAutoMigratableDb be x where
  defaultMigratableDbSettings' :: Proxy be -> x ()

instance GAutoMigratableDb be x => GAutoMigratableDb be (D1 f x) where
  defaultMigratableDbSettings' :: Proxy be -> D1 f x ()
defaultMigratableDbSettings' Proxy be
be = x () -> D1 f x ()
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (x () -> D1 f x ()) -> x () -> D1 f x ()
forall a b. (a -> b) -> a -> b
$ Proxy be -> x ()
forall be (x :: * -> *). GAutoMigratableDb be x => Proxy be -> x ()
defaultMigratableDbSettings' Proxy be
be

instance GAutoMigratableDb be x => GAutoMigratableDb be (C1 f x) where
  defaultMigratableDbSettings' :: Proxy be -> C1 f x ()
defaultMigratableDbSettings' Proxy be
be = x () -> C1 f x ()
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (x () -> C1 f x ()) -> x () -> C1 f x ()
forall a b. (a -> b) -> a -> b
$ Proxy be -> x ()
forall be (x :: * -> *). GAutoMigratableDb be x => Proxy be -> x ()
defaultMigratableDbSettings' Proxy be
be

instance (GAutoMigratableDb be x, GAutoMigratableDb be y) =>
  GAutoMigratableDb be (x :*: y) where
  defaultMigratableDbSettings' :: Proxy be -> (:*:) x y ()
defaultMigratableDbSettings' Proxy be
be = Proxy be -> x ()
forall be (x :: * -> *). GAutoMigratableDb be x => Proxy be -> x ()
defaultMigratableDbSettings' Proxy be
be x () -> y () -> (:*:) x y ()
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: Proxy be -> y ()
forall be (x :: * -> *). GAutoMigratableDb be x => Proxy be -> x ()
defaultMigratableDbSettings' Proxy be
be

instance ( Selector f, IsCheckedDatabaseEntity be x
         , CheckedDatabaseEntityDefaultRequirements be x ) =>
  GAutoMigratableDb be (S1 f (Rec0 (CheckedDatabaseEntity be db x))) where

  defaultMigratableDbSettings' :: Proxy be -> S1 f (Rec0 (CheckedDatabaseEntity be db x)) ()
defaultMigratableDbSettings' Proxy be
_ = K1 R (CheckedDatabaseEntity be db x) ()
-> S1 f (Rec0 (CheckedDatabaseEntity be db x)) ()
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (CheckedDatabaseEntity be db x
-> K1 R (CheckedDatabaseEntity be db x) ()
forall k i c (p :: k). c -> K1 i c p
K1 (CheckedDatabaseEntityDescriptor be x
-> [SomeDatabasePredicate] -> CheckedDatabaseEntity be db x
forall be entityType (db :: (* -> *) -> *).
IsCheckedDatabaseEntity be entityType =>
CheckedDatabaseEntityDescriptor be entityType
-> [SomeDatabasePredicate]
-> CheckedDatabaseEntity be db entityType
CheckedDatabaseEntity (Text -> CheckedDatabaseEntityDescriptor be x
forall be entity.
(IsCheckedDatabaseEntity be entity,
 CheckedDatabaseEntityDefaultRequirements be entity) =>
Text -> CheckedDatabaseEntityDescriptor be entity
checkedDbEntityAuto Text
name) []))
    where name :: Text
name = String -> Text
T.pack (S1 f (Rec0 (CheckedDatabaseEntity be db x)) () -> String
forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> String
selName (S1 f (Rec0 (CheckedDatabaseEntity be db x)) ()
forall a. HasCallStack => a
undefined :: S1 f (Rec0 (CheckedDatabaseEntity be db x)) ()))