module Resource ( Resource , resourceCreatedAt , resourceEditedAt , resourceDeletedAt , Status(..) , statuses , groupByStatus , statusDuring ) where import Data.Map (Map) import qualified Data.Map as M import Data.Maybe (fromMaybe) import Data.Time.Clock (UTCTime) class Resource a where resourceCreatedAt :: a -> UTCTime resourceEditedAt :: a -> Maybe UTCTime resourceDeletedAt :: a -> Maybe UTCTime data Status = Created | Edited | Deleted deriving (Eq, Show, Read, Ord, Enum, Bounded) statuses :: [Status] statuses = [minBound..] groupByStatus :: Resource a => UTCTime -> UTCTime -> [a] -> Map Status [a] groupByStatus start end resources = foldl (\m resource -> case statusDuring start end resource of Just status -> M.insertWith (++) status [resource] m Nothing -> m ) M.empty resources statusDuring :: Resource a => UTCTime -> UTCTime -> a -> Maybe Status statusDuring start end resource | created && not deleted = Just Created | not created && edited && not deleted = Just Edited | not created && deleted = Just Deleted | otherwise = Nothing where created = belongs (resourceCreatedAt resource) start end edited = fromMaybe False (fmap (\t -> belongs t start end) $ resourceEditedAt resource) deleted = fromMaybe False (fmap (\t -> belongs t start end) $ resourceDeletedAt resource) belongs :: UTCTime -> UTCTime -> UTCTime -> Bool belongs time start end = time >= start && time < end