{-# OPTIONS_GHC -Wall #-}
import Data.List (find)
newtype UserAgent = UserAgent String deriving (Show, Eq, Ord)
newtype AcceptLanguage = AcceptLanguage String deriving (Show, Eq, Ord)
newtype Country = Country String deriving (Show, Eq, Ord)
data Rule = UserAgentRule UserAgent | AcceptLanguageRule AcceptLanguage | CountryAndUserAgentRule Country UserAgent
deriving (Show, Eq, Ord)
rules :: [Rule]
rules = [
UserAgentRule (UserAgent "firefox")
, UserAgentRule (UserAgent "Android 4.2.2; GT-I9505")
, CountryAndUserAgentRule (Country "qa") (UserAgent "Android 6.0.1; SM-G900F")
]
data Visitor = Visitor Country UserAgent AcceptLanguage
deriving (Show, Eq, Ord)
isAMatch :: Visitor -> Rule -> Bool
isAMatch (Visitor vCountry vUserAgent vAcceptLanguage) rule = case rule of
UserAgentRule rUserAgent -> vUserAgent == rUserAgent
-- AcceptLanguageRule rAcceptLanguage -> vAcceptLanguage == rAcceptLanguage
CountryAndUserAgentRule rCountry rUserAgent -> vCountry == rCountry && vUserAgent == rUserAgent
findRule :: Visitor -> Maybe Rule
findRule visitor = find (isAMatch visitor) rules
main :: IO ()
main = do
let visitor1 = Visitor (Country "qa") (UserAgent "Android 6.0.1; SM-G900F") (AcceptLanguage "en")
print (findRule visitor1)
let visitor2 = Visitor (Country "aa") (UserAgent "Android 6.0.1; SM-AAAA") (AcceptLanguage "en")
print (findRule visitor2)