summaryrefslogtreecommitdiff
path: root/Model.hs
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2017-03-15 20:11:41 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2017-03-15 20:11:41 +0100
commit127d763a6a68d8fd242e093ba9f55bf769635842 (patch)
treea864c82c0476766cb61ae6c2d009581f4ef89d1e /Model.hs
parent7888d76bc45caed34cb3aa10824807d01057d746 (diff)
downloadbar-127d763a6a68d8fd242e093ba9f55bf769635842.tar
bar-127d763a6a68d8fd242e093ba9f55bf769635842.tar.gz
bar-127d763a6a68d8fd242e093ba9f55bf769635842.tar.bz2
bar-127d763a6a68d8fd242e093ba9f55bf769635842.tar.xz
bar-127d763a6a68d8fd242e093ba9f55bf769635842.zip
Make typing many items more efficient
Diffstat (limited to 'Model.hs')
-rw-r--r--Model.hs35
1 files changed, 28 insertions, 7 deletions
diff --git a/Model.hs b/Model.hs
index 13f18b8..90f5904 100644
--- a/Model.hs
+++ b/Model.hs
@@ -10,6 +10,9 @@ import Control.Monad.Writer
10import Data.Text (Text) 10import Data.Text (Text)
11import qualified Data.Text as Text 11import qualified Data.Text as Text
12 12
13import Data.Map (Map, (!))
14import qualified Data.Map as Map
15
13import qualified Data.HashMap.Lazy as HashMap 16import qualified Data.HashMap.Lazy as HashMap
14 17
15import Data.Aeson 18import Data.Aeson
@@ -23,19 +26,24 @@ share [mkPersist sqlSettings, mkMigrate "migrateAll"]
23 $(persistFileWith lowerCaseSettings "config/models") 26 $(persistFileWith lowerCaseSettings "config/models")
24 27
25class HasType a where 28class HasType a where
26 getType :: ( BaseBackend backend ~ SqlBackend 29 fkType :: a -> Key Kind
27 , MonadIO m 30
28 , PersistStoreRead backend 31getType :: ( BaseBackend backend ~ SqlBackend
29 ) => a -> ReaderT backend m Kind 32 , MonadIO m
33 , PersistStoreRead backend
34 , HasType a
35 ) => a -> ReaderT backend m Kind
36getType = getJust . fkType
30 37
31instance HasType Item where 38instance HasType Item where
32 getType = belongsToJust itemFkType 39 fkType = itemFkType
33 40
34instance HasType Reference where 41instance HasType Reference where
35 getType = belongsToJust referenceFkType 42 fkType = referenceFkType
36 43
37instance HasType a => HasType (Entity a) where 44instance HasType a => HasType (Entity a) where
38 getType Entity{..} = getType entityVal 45 fkType = fkType . entityVal
46
39 47
40withType :: ( BaseBackend backend ~ SqlBackend 48withType :: ( BaseBackend backend ~ SqlBackend
41 , MonadIO m 49 , MonadIO m
@@ -44,6 +52,19 @@ withType :: ( BaseBackend backend ~ SqlBackend
44 ) => a -> ReaderT backend m (WithType a) 52 ) => a -> ReaderT backend m (WithType a)
45withType val = (val `WithType`) . kindType <$> getType val 53withType val = (val `WithType`) . kindType <$> getType val
46 54
55withTypes :: ( BaseBackend backend ~ SqlBackend
56 , MonadIO m
57 , PersistStoreRead backend
58 , PersistQueryRead backend
59 , HasType a
60 , Functor f
61 ) => f a -> ReaderT backend m (f (WithType a))
62withTypes vals = do
63 typeMap <- Map.fromList . map (\(Entity kindKey kind) -> (kindKey, kind)) <$> selectList [] []
64 let
65 lookupType x = (x `WithType`) . kindType $ typeMap ! fkType x
66 return $ lookupType <$> vals
67
47instance Ord Item where 68instance Ord Item where
48 x `compare` y = mconcat cmprs 69 x `compare` y = mconcat cmprs
49 where 70 where