{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module ClassyPrelude.Yesod
    ( module X
    , module ClassyPrelude.Yesod
    ) where

import ClassyPrelude.Conduit as X hiding (lift)
import Yesod as X hiding (Header, insert, delete)
import qualified Yesod
import Yesod.Static as X
import Yesod.Feed as X
import Network.HTTP.Conduit as X
import Network.HTTP.Types as X
import qualified ClassyPrelude.Classes
import Database.Persist.Sql as X (SqlBackend, SqlPersistT)
import Database.Persist.Sql as X (runMigration)
import Data.Default as X (Default (..))

instance
  ( backend ~ PersistMonadBackend m
  , backend ~ PersistEntityBackend entity
  , PersistStore m
  , PersistEntity entity
  , entity ~ entity'
  ) => ClassyPrelude.Classes.CanInsert (entity -> m (KeyBackend backend entity')) where
    insert = Yesod.insert

-- | Non-typeclass insert for use with Persistent.
--
-- If you don\'t use the @Key@ returned from @insert@, the type inferencing
-- cannot tell which @insert@ function to use. Using @insertDB@ disambiguates.
-- Another options is using 'voidKey'.
--
-- Since 0.1.0.0
insertDB :: ( PersistStore m
            , PersistEntity entity
            , PersistMonadBackend m ~ PersistEntityBackend entity
            )
         => entity
         -> m (Key entity)
insertDB = Yesod.insert

-- | Ignore the @Key@ returned by insert.
--
-- See 'insertDB' for more information. The following two lines are equivalent:
--
-- > _ <- insertDB foo
-- > voidKey $ insert foo
--
-- Since 0.1.0.0
voidKey :: Functor m => m (KeyBackend backend entity) -> m ()
voidKey = void

instance
  ( backend ~ PersistMonadBackend m
  , backend ~ PersistEntityBackend entity
  , PersistStore m
  , PersistEntity entity
  , a ~ ()
  ) => ClassyPrelude.Classes.CanDelete (KeyBackend backend entity -> m a) where
    delete = Yesod.delete