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
(Int -> CacheTTL -> ShowS)
-> (CacheTTL -> String) -> ([CacheTTL] -> ShowS) -> Show CacheTTL
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
(CacheTTL -> CacheTTL -> Bool)
-> (CacheTTL -> CacheTTL -> Bool) -> Eq CacheTTL
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
Eq CacheTTL
-> (CacheTTL -> CacheTTL -> Ordering)
-> (CacheTTL -> CacheTTL -> Bool)
-> (CacheTTL -> CacheTTL -> Bool)
-> (CacheTTL -> CacheTTL -> Bool)
-> (CacheTTL -> CacheTTL -> Bool)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> Ord 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
$cp1Ord :: Eq CacheTTL
Ord, Int -> CacheTTL
CacheTTL -> Int
CacheTTL -> [CacheTTL]
CacheTTL -> CacheTTL
CacheTTL -> CacheTTL -> [CacheTTL]
CacheTTL -> CacheTTL -> CacheTTL -> [CacheTTL]
(CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL)
-> (Int -> CacheTTL)
-> (CacheTTL -> Int)
-> (CacheTTL -> [CacheTTL])
-> (CacheTTL -> CacheTTL -> [CacheTTL])
-> (CacheTTL -> CacheTTL -> [CacheTTL])
-> (CacheTTL -> CacheTTL -> CacheTTL -> [CacheTTL])
-> Enum 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
(CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL)
-> (Integer -> CacheTTL)
-> Num 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
Num CacheTTL
-> Ord CacheTTL -> (CacheTTL -> Rational) -> Real CacheTTL
CacheTTL -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: CacheTTL -> Rational
$ctoRational :: CacheTTL -> Rational
$cp2Real :: Ord CacheTTL
$cp1Real :: Num CacheTTL
Real, Enum CacheTTL
Real CacheTTL
Real CacheTTL
-> Enum CacheTTL
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> CacheTTL)
-> (CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL))
-> (CacheTTL -> CacheTTL -> (CacheTTL, CacheTTL))
-> (CacheTTL -> Integer)
-> Integral 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
$cp2Integral :: Enum CacheTTL
$cp1Integral :: Real CacheTTL
Integral)

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

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

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