module Freckle.App.Memcached.CacheTTL
  ( CacheTTL
  , cacheTTL
  , fromCacheTTL
  ) where

import Freckle.App.Prelude

import Data.Word (Word32)
import Database.Memcache.Types (Expiration)

newtype CacheTTL = CacheTTL Int
  deriving stock Int -> CacheTTL -> ShowS
[CacheTTL] -> ShowS
CacheTTL -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CacheTTL] -> ShowS
$cshowList :: [CacheTTL] -> ShowS
show :: CacheTTL -> String
$cshow :: CacheTTL -> String
showsPrec :: Int -> CacheTTL -> ShowS
$cshowsPrec :: Int -> CacheTTL -> ShowS
Show
  deriving newtype (CacheTTL -> CacheTTL -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CacheTTL -> CacheTTL -> Bool
$c/= :: CacheTTL -> CacheTTL -> Bool
== :: CacheTTL -> CacheTTL -> Bool
$c== :: CacheTTL -> CacheTTL -> Bool
Eq, Eq CacheTTL
CacheTTL -> CacheTTL -> Bool
CacheTTL -> CacheTTL -> Ordering
CacheTTL -> CacheTTL -> CacheTTL
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CacheTTL -> CacheTTL -> CacheTTL
$cmin :: CacheTTL -> CacheTTL -> CacheTTL
max :: CacheTTL -> CacheTTL -> CacheTTL
$cmax :: CacheTTL -> CacheTTL -> CacheTTL
>= :: CacheTTL -> CacheTTL -> Bool
$c>= :: CacheTTL -> CacheTTL -> Bool
> :: CacheTTL -> CacheTTL -> Bool
$c> :: CacheTTL -> CacheTTL -> Bool
<= :: CacheTTL -> CacheTTL -> Bool
$c<= :: CacheTTL -> CacheTTL -> Bool
< :: CacheTTL -> CacheTTL -> Bool
$c< :: CacheTTL -> CacheTTL -> Bool
compare :: CacheTTL -> CacheTTL -> Ordering
$ccompare :: CacheTTL -> CacheTTL -> Ordering
Ord, Int -> CacheTTL
CacheTTL -> Int
CacheTTL -> [CacheTTL]
CacheTTL -> CacheTTL
CacheTTL -> CacheTTL -> [CacheTTL]
CacheTTL -> CacheTTL -> CacheTTL -> [CacheTTL]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: CacheTTL -> CacheTTL -> CacheTTL -> [CacheTTL]
$cenumFromThenTo :: CacheTTL -> CacheTTL -> CacheTTL -> [CacheTTL]
enumFromTo :: CacheTTL -> CacheTTL -> [CacheTTL]
$cenumFromTo :: CacheTTL -> CacheTTL -> [CacheTTL]
enumFromThen :: CacheTTL -> CacheTTL -> [CacheTTL]
$cenumFromThen :: CacheTTL -> CacheTTL -> [CacheTTL]
enumFrom :: CacheTTL -> [CacheTTL]
$cenumFrom :: CacheTTL -> [CacheTTL]
fromEnum :: CacheTTL -> Int
$cfromEnum :: CacheTTL -> Int
toEnum :: Int -> CacheTTL
$ctoEnum :: Int -> CacheTTL
pred :: CacheTTL -> CacheTTL
$cpred :: CacheTTL -> CacheTTL
succ :: CacheTTL -> CacheTTL
$csucc :: CacheTTL -> CacheTTL
Enum, Integer -> CacheTTL
CacheTTL -> CacheTTL
CacheTTL -> CacheTTL -> CacheTTL
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> CacheTTL
$cfromInteger :: Integer -> CacheTTL
signum :: CacheTTL -> CacheTTL
$csignum :: CacheTTL -> CacheTTL
abs :: CacheTTL -> CacheTTL
$cabs :: CacheTTL -> CacheTTL
negate :: CacheTTL -> CacheTTL
$cnegate :: CacheTTL -> CacheTTL
* :: CacheTTL -> CacheTTL -> CacheTTL
$c* :: CacheTTL -> CacheTTL -> CacheTTL
- :: CacheTTL -> CacheTTL -> CacheTTL
$c- :: CacheTTL -> CacheTTL -> CacheTTL
+ :: CacheTTL -> CacheTTL -> CacheTTL
$c+ :: CacheTTL -> CacheTTL -> CacheTTL
Num, Num CacheTTL
Ord CacheTTL
CacheTTL -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: CacheTTL -> Rational
$ctoRational :: CacheTTL -> Rational
Real, Enum CacheTTL
Real CacheTTL
CacheTTL -> Integer
CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL)
CacheTTL -> CacheTTL -> CacheTTL
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: CacheTTL -> Integer
$ctoInteger :: CacheTTL -> Integer
divMod :: CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL)
$cdivMod :: CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL)
quotRem :: CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL)
$cquotRem :: CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL)
mod :: CacheTTL -> CacheTTL -> CacheTTL
$cmod :: CacheTTL -> CacheTTL -> CacheTTL
div :: CacheTTL -> CacheTTL -> CacheTTL
$cdiv :: CacheTTL -> CacheTTL -> CacheTTL
rem :: CacheTTL -> CacheTTL -> CacheTTL
$crem :: CacheTTL -> CacheTTL -> CacheTTL
quot :: CacheTTL -> CacheTTL -> CacheTTL
$cquot :: CacheTTL -> CacheTTL -> CacheTTL
Integral)

cacheTTL :: Int -> CacheTTL
cacheTTL :: Int -> CacheTTL
cacheTTL = Int -> CacheTTL
CacheTTL

fromCacheTTL :: CacheTTL -> Expiration
fromCacheTTL :: CacheTTL -> Word32
fromCacheTTL (CacheTTL Int
i)
  | Int
i forall a. Ord a => a -> a -> Bool
< forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
minWord = Word32
minWord
  | Int
i forall a. Ord a => a -> a -> Bool
> forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
maxWord = Word32
maxWord
  | Bool
otherwise = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i
 where
  minWord :: Word32
  minWord :: Word32
minWord = forall a. Bounded a => a
minBound

  maxWord :: Word32
  maxWord :: Word32
maxWord = forall a. Bounded a => a
maxBound