aboutsummaryrefslogtreecommitdiff
path: root/Data/ConfigManager/Parser/Duration.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Data/ConfigManager/Parser/Duration.hs')
-rw-r--r--Data/ConfigManager/Parser/Duration.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/Data/ConfigManager/Parser/Duration.hs b/Data/ConfigManager/Parser/Duration.hs
new file mode 100644
index 0000000..f169c55
--- /dev/null
+++ b/Data/ConfigManager/Parser/Duration.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Data.ConfigManager.Parser.Duration
+ ( parseDuration
+ ) where
+
+import Control.Applicative ((<|>))
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Time.Clock (DiffTime)
+import qualified Data.Time.Clock as Time
+
+import Text.Read (readMaybe)
+
+parseDuration :: Text -> Maybe DiffTime
+parseDuration input =
+ case T.splitOn " " input of
+ [count, unit] -> do
+ n <- readMaybe . T.unpack $ count
+ let matchDuration singularUnit pluralUnit seconds =
+ if ((n == 0 || n == 1) && unit == singularUnit) || (n > 1 && unit == pluralUnit)
+ then Just . Time.secondsToDiffTime $ n * seconds
+ else Nothing
+ (matchDuration "second" "seconds" second)
+ <|> (matchDuration "minute" "minutes" minute)
+ <|> (matchDuration "hour" "hours" hour)
+ <|> (matchDuration "day" "days" day)
+ <|> (matchDuration "week" "weeks" week)
+ _ -> Nothing
+ where
+ second = 1
+ minute = 60 * second
+ hour = 60 * minute
+ day = 24 * hour
+ week = 7 * day