--
-- Time to manipulate time
--
-- Copyright © 2013-2016 Operational Dynamics Consulting, Pty Ltd and Others
--
-- The code in this file, and the program it is a part of, is
-- made available to you by its authors as open source software:
-- you can redistribute it and/or modify it under the terms of
-- the 3-clause BSD licence.
--

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Chrono.Formats
(
    ISO8601_Precise(..)
  , ISO8601_Seconds(..)
  , ISO8601_Days(..)
  , Posix_Precise(..)
  , Posix_Micro(..)
  , Posix_Milli(..)
  , Posix_Seconds(..)
) where

import Data.Hourglass

--
-- | Format string describing full (nanosecond) precision ISO8601 time,
--
-- > 2014-07-31T23:09:35.274387019Z
--
data ISO8601_Precise = ISO8601_Precise

instance TimeFormat ISO8601_Precise where
    toFormat _ = TimeFormatString
        [ Format_Year
        , Format_Text '-'
        , Format_Month2
        , Format_Text '-'
        , Format_Day2
        , Format_Text 'T'
        , Format_Hour
        , Format_Text ':'
        , Format_Minute
        , Format_Text ':'
        , Format_Second
        , Format_Text '.'
        , Format_Precision 9
        , Format_Text 'Z'
        ]

data ISO8601_Seconds = ISO8601_Seconds

instance TimeFormat ISO8601_Seconds where
    toFormat _ = TimeFormatString
        [ Format_Year
        , Format_Text '-'
        , Format_Month2
        , Format_Text '-'
        , Format_Day2
        , Format_Text 'T'
        , Format_Hour
        , Format_Text ':'
        , Format_Minute
        , Format_Text ':'
        , Format_Second
        , Format_Text 'Z'
        ]

data ISO8601_Days = ISO8601_Days

instance TimeFormat ISO8601_Days where
    toFormat _ = TimeFormatString
        [ Format_Year
        , Format_Text '-'
        , Format_Month2
        , Format_Text '-'
        , Format_Day2
        ]

data Posix_Precise = Posix_Precise

instance TimeFormat Posix_Precise where
    toFormat _ = TimeFormatString
        [ Format_UnixSecond
        , Format_Text '.'
        , Format_MilliSecond
        , Format_MicroSecond
        , Format_NanoSecond
        ]

data Posix_Micro = Posix_Micro

instance TimeFormat Posix_Micro where
    toFormat _ = TimeFormatString
        [ Format_UnixSecond
        , Format_Text '.'
        , Format_MilliSecond
        , Format_MicroSecond
        ]

data Posix_Milli = Posix_Milli

instance TimeFormat Posix_Milli where
    toFormat _ = TimeFormatString
        [ Format_UnixSecond
        , Format_Text '.'
        , Format_MilliSecond
        ]

data Posix_Seconds = Posix_Seconds

instance TimeFormat Posix_Seconds where
    toFormat _ = TimeFormatString
        [ Format_UnixSecond
        ]