Created
August 14, 2014 13:18
-
-
Save ClaireNeveu/8d806e360ccb9ac8d6e0 to your computer and use it in GitHub Desktop.
Duration
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE FlexibleInstances, PostfixOperators, GeneralizedNewtypeDeriving #-} | |
module Data.Duration | |
( Duration | |
, seconds | |
, second | |
, minutes | |
, minute | |
, hours | |
, hour | |
, days | |
, day | |
, weeks | |
, week | |
, toMillis | |
, toSeconds | |
, toMinutes | |
, toHours | |
, toDays | |
, toWeeks | |
) where | |
data Milliseconds | |
data Seconds | |
data Minutes | |
data Hours | |
data Days | |
data Weeks | |
newtype Duration a = Duration Int deriving (Num, Eq, Ord) | |
instance Show (Duration Milliseconds) where | |
show (Duration 1) = "1 Millisecond" | |
show (Duration i) = (show i) ++ " Milliseconds" | |
instance Show (Duration Seconds) where | |
show (Duration 1) = "1 Second" | |
show (Duration i) = (show i) ++ " Seconds" | |
instance Show (Duration Minutes) where | |
show (Duration 1) = "1 Minute" | |
show (Duration i) = (show i) ++ " Minutes" | |
instance Show (Duration Hours) where | |
show (Duration 1) = "1 Hour" | |
show (Duration i) = (show i) ++ " Hours" | |
instance Show (Duration Days) where | |
show (Duration 1) = "1 Day" | |
show (Duration i) = (show i) ++ " Days" | |
instance Show (Duration Weeks) where | |
show (Duration 1) = "1 Week" | |
show (Duration i) = (show i) ++ " Weeks" | |
class CanConvertToMillis t where | |
toMillis :: t -> Int | |
instance CanConvertToMillis (Duration Milliseconds) where | |
toMillis (Duration i) = i | |
instance CanConvertToMillis (Duration Seconds) where | |
toMillis (Duration i) = i * 1000 | |
instance CanConvertToMillis (Duration Minutes) where | |
toMillis (Duration i) = i * 60000 | |
instance CanConvertToMillis (Duration Hours) where | |
toMillis (Duration i) = i * 360000 | |
instance CanConvertToMillis (Duration Days) where | |
toMillis (Duration i) = i * 8640000 | |
instance CanConvertToMillis (Duration Weeks) where | |
toMillis (Duration i) = i * 60480000 | |
class CanConvertToSeconds t where | |
toSeconds :: t -> Int | |
instance CanConvertToSeconds (Duration Milliseconds) where | |
toSeconds (Duration i) = i `div` 1000 | |
instance CanConvertToSeconds (Duration Seconds) where | |
toSeconds (Duration i) = i | |
instance CanConvertToSeconds (Duration Minutes) where | |
toSeconds (Duration i) = i * 60 | |
instance CanConvertToSeconds (Duration Hours) where | |
toSeconds (Duration i) = i * 360 | |
instance CanConvertToSeconds (Duration Days) where | |
toSeconds (Duration i) = i * 8640 | |
instance CanConvertToSeconds (Duration Weeks) where | |
toSeconds (Duration i) = i * 60480 | |
class CanConvertToMinutes t where | |
toMinutes :: t -> Int | |
instance CanConvertToMinutes (Duration Milliseconds) where | |
toMinutes (Duration i) = i `div` 60000 | |
instance CanConvertToMinutes (Duration Seconds) where | |
toMinutes (Duration i) = i `div` 60 | |
instance CanConvertToMinutes (Duration Minutes) where | |
toMinutes (Duration i) = i | |
instance CanConvertToMinutes (Duration Hours) where | |
toMinutes (Duration i) = i * 60 | |
instance CanConvertToMinutes (Duration Days) where | |
toMinutes (Duration i) = i * 1440 | |
instance CanConvertToMinutes (Duration Weeks) where | |
toMinutes (Duration i) = i * 10080 | |
class CanConvertToHours t where | |
toHours :: t -> Int | |
instance CanConvertToHours (Duration Milliseconds) where | |
toHours (Duration i) = i `div` 360000 | |
instance CanConvertToHours (Duration Seconds) where | |
toHours (Duration i) = i `div` 360 | |
instance CanConvertToHours (Duration Minutes) where | |
toHours (Duration i) = i `div` 60 | |
instance CanConvertToHours (Duration Hours) where | |
toHours (Duration i) = i | |
instance CanConvertToHours (Duration Days) where | |
toHours (Duration i) = i * 24 | |
instance CanConvertToHours (Duration Weeks) where | |
toHours (Duration i) = i * 168 | |
class CanConvertToDays t where | |
toDays :: t -> Int | |
instance CanConvertToDays (Duration Milliseconds) where | |
toDays (Duration i) = i `div` 86400000 | |
instance CanConvertToDays (Duration Seconds) where | |
toDays (Duration i) = i `div` 86400 | |
instance CanConvertToDays (Duration Minutes) where | |
toDays (Duration i) = i `div` 1440 | |
instance CanConvertToDays (Duration Hours) where | |
toDays (Duration i) = i `div` 24 | |
instance CanConvertToDays (Duration Days) where | |
toDays (Duration i) = i | |
instance CanConvertToDays (Duration Weeks) where | |
toDays (Duration i) = i * 7 | |
class CanConvertToWeeks t where | |
toWeeks :: t -> Int | |
instance CanConvertToWeeks (Duration Milliseconds) where | |
toWeeks (Duration i) = i `div` 604800000 | |
instance CanConvertToWeeks (Duration Seconds) where | |
toWeeks (Duration i) = i `div` 604800 | |
instance CanConvertToWeeks (Duration Minutes) where | |
toWeeks (Duration i) = i `div` 10080 | |
instance CanConvertToWeeks (Duration Hours) where | |
toWeeks (Duration i) = i `div` 168 | |
instance CanConvertToWeeks (Duration Days) where | |
toWeeks (Duration i) = i `div` 7 | |
instance CanConvertToWeeks (Duration Weeks) where | |
toWeeks (Duration i) = i | |
milliseconds :: Int -> Duration Milliseconds | |
milliseconds i = Duration i | |
millisecond :: Int -> Duration Milliseconds | |
millisecond i = Duration i | |
seconds :: Int -> Duration Seconds | |
seconds i = Duration i | |
second :: Int -> Duration Seconds | |
second i = Duration i | |
minutes :: Int -> Duration Minutes | |
minutes i = Duration i | |
minute :: Int -> Duration Minutes | |
minute i = Duration i | |
hours :: Int -> Duration Hours | |
hours i = Duration i | |
hour :: Int -> Duration Hours | |
hour i = Duration i | |
days :: Int -> Duration Days | |
days i = Duration i | |
day :: Int -> Duration Days | |
day i = Duration i | |
weeks :: Int -> Duration Weeks | |
weeks i = Duration i | |
week :: Int -> Duration Weeks | |
week i = Duration i | |
{- | |
withTtl :: Result -> Duration a -> Result | |
withTtl d r = withHeaders result [("Surrogate-Control", "max-age=" + (show $ toSeconds d))] | |
withTtl (2 `minutes`) result | |
-} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment