module Data.Time.Util where

import           Control.Applicative

import           Data.Function
import           Data.Monoid         (mempty)
import           Data.Monoid.Textual hiding (foldr, map)
import           Data.Time
import           Data.Time.Format    (defaultTimeLocale)


toString' :: (TextualMonoid t) => t -> String
toString' :: t -> String
toString' = (t -> String) -> t -> String
forall t. TextualMonoid t => (t -> String) -> t -> String
toString (String -> (Char -> String) -> Maybe Char -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"?" (Char -> String -> String
forall a. a -> [a] -> [a]
:[]) (Maybe Char -> String) -> (t -> Maybe Char) -> t -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Char
forall t. TextualMonoid t => t -> Maybe Char
characterPrefix)

parseTimeUsing :: (TextualMonoid t, TextualMonoid t') => [t] -> t' -> Maybe ZonedTime
parseTimeUsing :: [t] -> t' -> Maybe ZonedTime
parseTimeUsing [t]
formats t'
t = (Maybe ZonedTime -> Maybe ZonedTime -> Maybe ZonedTime)
-> Maybe ZonedTime -> [Maybe ZonedTime] -> Maybe ZonedTime
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Maybe ZonedTime -> Maybe ZonedTime -> Maybe ZonedTime
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>) Maybe ZonedTime
forall a. Maybe a
Nothing ([Maybe ZonedTime] -> Maybe ZonedTime)
-> [Maybe ZonedTime] -> Maybe ZonedTime
forall a b. (a -> b) -> a -> b
$ (t -> Maybe ZonedTime) -> [t] -> [Maybe ZonedTime]
forall a b. (a -> b) -> [a] -> [b]
map t -> Maybe ZonedTime
forall t. TextualMonoid t => t -> Maybe ZonedTime
parse [t]
formats
    where parse :: (TextualMonoid t) => t -> Maybe ZonedTime
          parse :: t -> Maybe ZonedTime
parse t
format = TimeLocale -> String -> String -> Maybe ZonedTime
forall t. ParseTime t => TimeLocale -> String -> String -> Maybe t
parseTime TimeLocale
defaultTimeLocale (t -> String
forall t. TextualMonoid t => t -> String
toString' t
format) (t' -> String
forall t. TextualMonoid t => t -> String
toString' t'
t)