{-# LANGUAGE RecordWildCards #-} module Network.Wai.Middleware.Push.Referer.Multi where import Data.Set (Set) import qualified Data.Set as Set data Multi a = Multi { Multi a -> Int limit :: Int , Multi a -> [a] list :: [a] , Multi a -> Set a check :: Set a } deriving (Multi a -> Multi a -> Bool (Multi a -> Multi a -> Bool) -> (Multi a -> Multi a -> Bool) -> Eq (Multi a) forall a. Eq a => Multi a -> Multi a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Multi a -> Multi a -> Bool $c/= :: forall a. Eq a => Multi a -> Multi a -> Bool == :: Multi a -> Multi a -> Bool $c== :: forall a. Eq a => Multi a -> Multi a -> Bool Eq, Int -> Multi a -> ShowS [Multi a] -> ShowS Multi a -> String (Int -> Multi a -> ShowS) -> (Multi a -> String) -> ([Multi a] -> ShowS) -> Show (Multi a) forall a. Show a => Int -> Multi a -> ShowS forall a. Show a => [Multi a] -> ShowS forall a. Show a => Multi a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Multi a] -> ShowS $cshowList :: forall a. Show a => [Multi a] -> ShowS show :: Multi a -> String $cshow :: forall a. Show a => Multi a -> String showsPrec :: Int -> Multi a -> ShowS $cshowsPrec :: forall a. Show a => Int -> Multi a -> ShowS Show) empty :: Int -> Multi a empty :: Int -> Multi a empty n :: Int n = Int -> [a] -> Set a -> Multi a forall a. Int -> [a] -> Set a -> Multi a Multi Int n [] Set a forall a. Set a Set.empty singleton :: Int -> a -> Multi a singleton :: Int -> a -> Multi a singleton n :: Int n v :: a v = Int -> [a] -> Set a -> Multi a forall a. Int -> [a] -> Set a -> Multi a Multi Int n [a v] (Set a -> Multi a) -> Set a -> Multi a forall a b. (a -> b) -> a -> b $ a -> Set a forall a. a -> Set a Set.singleton a v insert :: Ord a => a -> Multi a -> Multi a insert :: a -> Multi a -> Multi a insert _ m :: Multi a m@Multi{..} | Set a -> Int forall a. Set a -> Int Set.size Set a check Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int limit = Multi a m insert v :: a v m :: Multi a m@Multi{..} | Set a -> Int forall a. Set a -> Int Set.size Set a check Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Set a -> Int forall a. Set a -> Int Set.size Set a check' = Multi a m | Bool otherwise = Int -> [a] -> Set a -> Multi a forall a. Int -> [a] -> Set a -> Multi a Multi Int limit (a va -> [a] -> [a] forall a. a -> [a] -> [a] :[a] list) Set a check' where check' :: Set a check' = a -> Set a -> Set a forall a. Ord a => a -> Set a -> Set a Set.insert a v Set a check