{- |
Module                  : Toml.Codec.Combinator.Time
Copyright               : (c) 2018-2021 Kowainik
SPDX-License-Identifier : MPL-2.0
Maintainer              : Kowainik <xrom.xkov@gmail.com>
Stability               : Stable
Portability             : Portable

TOML-specific combinators for converting between TOML and Haskell date and time
data types. TOML specification describes date and time primitives you
can use in your configuration. @tomland@ provides mapping of those
primitives to types from the @time@ library.

+-----------------+----------------------------+-------------------+
|  Haskell Type   |           @TOML@           |    'TomlCodec'    |
+=================+============================+===================+
| __'ZonedTime'__ | @a = 2020-05-16T04:32:00Z@ | @'zonedTime' "a"@ |
+-----------------+----------------------------+-------------------+
| __'LocalTime'__ | @a = 2020-05-16T04:32:00@  | @'localTime' "a"@ |
+-----------------+----------------------------+-------------------+
| __'Day'__       | @a = 2020-05-16@           | @'day' "a"@       |
+-----------------+----------------------------+-------------------+
| __'TimeOfDay'__ | @a = 04:32:00@             | @'timeOfDay' "a"@ |
+-----------------+----------------------------+-------------------+

@since 1.3.0.0
-}

module Toml.Codec.Combinator.Time
    ( zonedTime
    , localTime
    , day
    , timeOfDay
    ) where

import Data.Time (Day, LocalTime, TimeOfDay, ZonedTime)

import Toml.Codec.BiMap.Conversion (_Day, _LocalTime, _TimeOfDay, _ZonedTime)
import Toml.Codec.Combinator.Common (match)
import Toml.Codec.Types (TomlCodec)
import Toml.Type.Key (Key)


{- | Codec for zoned time values.

@since 0.5.0
-}
zonedTime :: Key -> TomlCodec ZonedTime
zonedTime :: Key -> TomlCodec ZonedTime
zonedTime = TomlBiMap ZonedTime AnyValue -> Key -> TomlCodec ZonedTime
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec a
match TomlBiMap ZonedTime AnyValue
_ZonedTime
{-# INLINE zonedTime #-}

{- | Codec for local time values.

@since 0.5.0
-}
localTime :: Key -> TomlCodec LocalTime
localTime :: Key -> TomlCodec LocalTime
localTime = TomlBiMap LocalTime AnyValue -> Key -> TomlCodec LocalTime
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec a
match TomlBiMap LocalTime AnyValue
_LocalTime
{-# INLINE localTime #-}

{- | Codec for day values.

@since 0.5.0
-}
day :: Key -> TomlCodec Day
day :: Key -> TomlCodec Day
day = TomlBiMap Day AnyValue -> Key -> TomlCodec Day
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec a
match TomlBiMap Day AnyValue
_Day
{-# INLINE day #-}

{- | Codec for time of day values.

@since 0.5.0
-}
timeOfDay :: Key -> TomlCodec TimeOfDay
timeOfDay :: Key -> TomlCodec TimeOfDay
timeOfDay = TomlBiMap TimeOfDay AnyValue -> Key -> TomlCodec TimeOfDay
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec a
match TomlBiMap TimeOfDay AnyValue
_TimeOfDay
{-# INLINE timeOfDay #-}