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

import Freckle.App.Prelude

import Data.Word (Word32)
import Database.Memcache.Types (Expiration)
import OpenTelemetry.Trace (ToAttribute (..))

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

instance ToAttribute CacheTTL where
  toAttribute :: CacheTTL -> Attribute
toAttribute (CacheTTL Int
x) = Int -> Attribute
forall a. ToAttribute a => a -> Attribute
toAttribute Int
x

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

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

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

-- | Standard 5 minute time to live
fiveMinuteTTL :: CacheTTL
fiveMinuteTTL :: CacheTTL
fiveMinuteTTL = Int -> CacheTTL
cacheTTL (Int -> CacheTTL) -> Int -> CacheTTL
forall a b. (a -> b) -> a -> b
$ Int
5 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60