{-# LANGUAGE NoImplicitPrelude #-} module Brok.Types.Link where import ClassyPrelude import Brok.Types.URL (URL) import qualified Data.Map.Strict as M (Map) data LinkType = UnresolvedLink | Cached | Ignored | Working Int | Broken Int | InvalidURL | ConnectionFailure deriving (Show, Eq) data Link = Link URL LinkType deriving (Show, Eq) type LinkDictionary = M.Map URL Link urlToLink :: URL -> Link urlToLink url = Link url UnresolvedLink getURL :: Link -> URL getURL (Link url _) = url working :: Link -> Int -> Link working (Link url UnresolvedLink) code = Link url (Working code) working lnk _ = lnk broken :: Link -> Int -> Link broken (Link url UnresolvedLink) code = Link url (Broken code) broken lnk _ = lnk failure :: Link -> Link failure (Link url UnresolvedLink) = Link url ConnectionFailure failure lnk = lnk invalid :: Link -> Link invalid (Link url UnresolvedLink) = Link url InvalidURL invalid lnk = lnk findLink :: LinkType -> (URL -> URL -> Bool) -> [URL] -> Link -> Link findLink lType fn urls (Link url UnresolvedLink) = case find (fn url) urls of Just _ -> Link url lType Nothing -> Link url UnresolvedLink findLink _ _ _ lnk = lnk cachedLink :: [URL] -> Link -> Link cachedLink = findLink Cached (==) ignoredLink :: [URL] -> Link -> Link ignoredLink = findLink Ignored (flip isPrefixOf) isSuccess :: Link -> Bool isSuccess (Link _ (Working _)) = True isSuccess _ = False