brok-0.2.0.0: src/Brok/Types/Link.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Brok.Types.Link where
import ClassyPrelude
import Brok.Types.App (App)
import Brok.Types.URL (URL)
data LinkType
= BareLink
| Cached
| Ignored
| Working Int
| Broken Int
| InvalidURL
| ConnectionFailure
deriving (Show, Eq)
data Link =
Link URL
LinkType
deriving (Show, Eq)
urlToLink :: URL -> Link
urlToLink url = Link url BareLink
getURL :: Link -> URL
getURL (Link url _) = url
working :: Link -> Int -> Link
working (Link url BareLink) code = Link url (Working code)
working lnk _ = lnk
broken :: Link -> Int -> Link
broken (Link url BareLink) code = Link url (Broken code)
broken lnk _ = lnk
failure :: Link -> Link
failure (Link url BareLink) = Link url ConnectionFailure
failure lnk = lnk
invalid :: Link -> Link
invalid (Link url BareLink) = Link url InvalidURL
invalid lnk = lnk
findLink :: LinkType -> (URL -> URL -> Bool) -> [URL] -> Link -> Link
findLink lType fn urls (Link url BareLink) =
case find (fn url) urls of
Just _ -> Link url lType
Nothing -> Link url BareLink
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
lmap :: (Link -> App Link) -> Link -> App Link
lmap fn (Link url BareLink) = fn (Link url BareLink)
lmap _ lnk = return lnk