+-- | Standalone database functions for dealing with Groundhog types.
+--
+module TSN.Database ( insert_or_select )
+where
+
+import Database.Groundhog ( AutoKey, insertByAll )
+import Database.Groundhog.Core ( PersistBackend, PersistEntity )
+
+
+-- | Attempt to insert the given object returning its new primary
+-- key. If any unique constraints would be violated, instead return
+-- the primary key of the existing record that caused the collision.
+insert_or_select :: (PersistBackend m, PersistEntity a)
+ => a
+ -> m (AutoKey a)
+insert_or_select x = do
+ tmp <- insertByAll x
+ return $ (either id id) tmp