{-# LANGUAGE UndecidableInstances #-}

{-# OPTIONS_GHC -Wno-unused-top-binds #-}

module Recursive (specsWith, recursiveMigrate, cleanup) where

import Init

share [mkPersist sqlSettings { mpsGeneric = True }, mkMigrate "recursiveMigrate"] [persistLowerCase|

SubType
  object [MenuObject]
  deriving Show Eq

MenuObject
  sub SubType Maybe
  deriving Show Eq

|]

cleanup
    :: (PersistStoreWrite (BaseBackend backend), PersistQueryWrite backend)
    => ReaderT backend IO ()
cleanup = do
  deleteWhere ([] :: [Filter (MenuObjectGeneric backend)])
  deleteWhere ([] :: [Filter (SubTypeGeneric backend)])

specsWith
    ::
    ( PersistStoreWrite backend
    , PersistStoreWrite (BaseBackend backend)
    , MonadIO m
    )
    => RunDb backend m
    -> Spec
specsWith runDb = describe "recursive definitions" $ do
  it "mutually recursive" $ runDb $ do
    let m1 = MenuObject $ Just $ SubType []
    let m2 = MenuObject $ Just $ SubType [m1]
    let m3 = MenuObject $ Just $ SubType [m2]
    k3 <- insert m3
    m3' <- get k3
    m3' @== Just m3
