Phsu-0.1.0.1: src/DBSupport.hs
{-# LANGUAGE DeriveDataTypeable, FlexibleContexts
, GeneralizedNewtypeDeriving, MultiParamTypeClasses
, OverloadedStrings, ScopedTypeVariables, TemplateHaskell
, TypeFamilies, FlexibleInstances #-}
module Main where
import Control.Applicative
import Control.Monad.Reader (ask)
import Control.Monad.State (modify)
import Data.Acid
import Data.Function
import Data.IntMap (IntMap, delete, adjust)
import Data.List
import Data.Ord
import Data.SafeCopy
import Data.Time
import Data.Typeable
import qualified Data.IntMap as IntMap
data URLSub = URLSub { regex :: String
, substitute:: String
, hits:: Int
, ruleId:: Int
} deriving (Show, Typeable)
data URLSubDb = URLSubDb { allRules :: IntMap URLSub }
deriving (Typeable)
allURLSubRules :: Query URLSubDb [URLSub]
allURLSubRules =
sortBy (comparing $ \x -> - (hits x)) . IntMap.elems . allRules <$> ask
addURLSub :: URLSub -> Update URLSubDb ()
addURLSub rule = modify go
where
go (URLSubDb db) = URLSubDb $
case IntMap.maxViewWithKey db of
Just ((max, _), _) -> IntMap.insert (max + 1) rule{hits=0, ruleId=max+1} db
Nothing -> IntMap.singleton 1 rule{hits=0, ruleId=1}
removeURLSub :: Int -> Update URLSubDb ()
removeURLSub ruleId = modify go
where
go (URLSubDb db) = URLSubDb $ IntMap.delete ruleId db
updateURLSub :: URLSub -> Update URLSubDb ()
updateURLSub rule = modify go
where
go (URLSubDb db) = URLSubDb $ IntMap.adjust (\old_rule -> old_rule{regex=(regex rule), substitute=(substitute rule)}) (ruleId rule) db
$(deriveSafeCopy 0 'base ''URLSub)
$(deriveSafeCopy 0 'base ''URLSubDb)
makeAcidic ''URLSubDb ['allURLSubRules , 'addURLSub, 'removeURLSub, 'updateURLSub]
main :: IO ()
main = do
state <- openLocalState (URLSubDb IntMap.empty)
-- Record a new failure
-- update state (AddURLSub $ URLSub "TEST" "Sub" 9 4)
-- update state (RemoveURLSub 5)
-- update state (UpdateURLSub $ URLSub{regex="regex", substitute="Trauma", hits=4, ruleId=10})
update state (AddURLSub $ URLSub{regex="c\\s?([0-9]*)L?", substitute="https://console.zenefits.com/console/company/\\1", hits=4, ruleId=10})
-- Query for all failures
allRules <- query state AllURLSubRules
mapM_ print allRules