{-# LANGUAGE CPP #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
#include "thyme.h"
#if HLINT
#include "cabal_macros.h"
#endif
module Data.Thyme.Calendar.OrdinalDate
( Year, isLeapYear
, DayOfYear
, OrdinalDate (..), _odYear, _odDay
, ordinalDate
, module Data.Thyme.Calendar.OrdinalDate
) where
import Prelude
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
import Control.Arrow
import Control.Lens
import Control.Monad
import Data.Thyme.Calendar
import Data.Thyme.Calendar.Internal
import System.Random
import Test.QuickCheck
instance Bounded OrdinalDate where
minBound :: OrdinalDate
minBound = forall a. Bounded a => a
minBound forall s a. s -> Getting a s a -> a
^. Iso' Day OrdinalDate
ordinalDate
maxBound :: OrdinalDate
maxBound = forall a. Bounded a => a
maxBound forall s a. s -> Getting a s a -> a
^. Iso' Day OrdinalDate
ordinalDate
instance Random OrdinalDate where
randomR :: forall g.
RandomGen g =>
(OrdinalDate, OrdinalDate) -> g -> (OrdinalDate, g)
randomR = forall s g a.
(Random s, RandomGen g) =>
Iso' s a -> (a, a) -> g -> (a, g)
randomIsoR Iso' Day OrdinalDate
ordinalDate
random :: forall g. RandomGen g => g -> (OrdinalDate, g)
random = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (forall s a. s -> Getting a s a -> a
^. Iso' Day OrdinalDate
ordinalDate) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a g. (Random a, RandomGen g) => g -> (a, g)
random
instance Arbitrary OrdinalDate where
arbitrary :: Gen OrdinalDate
arbitrary = forall a s. Getting a s a -> s -> a
view Iso' Day OrdinalDate
ordinalDate forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary
shrink :: OrdinalDate -> [OrdinalDate]
shrink OrdinalDate
od = forall a s. Getting a s a -> s -> a
view Iso' Day OrdinalDate
ordinalDate forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => a -> [a]
shrink (Iso' Day OrdinalDate
ordinalDate forall s t a b. AReview s t a b -> b -> t
# OrdinalDate
od)
instance CoArbitrary OrdinalDate where
coarbitrary :: forall b. OrdinalDate -> Gen b -> Gen b
coarbitrary (OrdinalDate DayOfYear
y DayOfYear
d) = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary DayOfYear
y forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary DayOfYear
d
{-# INLINE ordinalDateValid #-}
ordinalDateValid :: OrdinalDate -> Maybe Day
ordinalDateValid :: OrdinalDate -> Maybe Day
ordinalDateValid od :: OrdinalDate
od@(OrdinalDate DayOfYear
y DayOfYear
d) = Iso' Day OrdinalDate
ordinalDate forall s t a b. AReview s t a b -> b -> t
# OrdinalDate
od
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall (f :: * -> *). Alternative f => Bool -> f ()
guard (DayOfYear
1 forall a. Ord a => a -> a -> Bool
<= DayOfYear
d Bool -> Bool -> Bool
&& DayOfYear
d forall a. Ord a => a -> a -> Bool
<= if DayOfYear -> Bool
isLeapYear DayOfYear
y then DayOfYear
366 else DayOfYear
365)
{-# INLINE toOrdinalDate #-}
toOrdinalDate :: Day -> (Year, DayOfYear)
toOrdinalDate :: Day -> (DayOfYear, DayOfYear)
toOrdinalDate (forall a s. Getting a s a -> s -> a
view Iso' Day OrdinalDate
ordinalDate -> OrdinalDate DayOfYear
y DayOfYear
d) = (DayOfYear
y, DayOfYear
d)
{-# INLINE fromOrdinalDate #-}
fromOrdinalDate :: Year -> DayOfYear -> Day
fromOrdinalDate :: DayOfYear -> DayOfYear -> Day
fromOrdinalDate DayOfYear
y DayOfYear
d = Iso' Day OrdinalDate
ordinalDate forall s t a b. AReview s t a b -> b -> t
# DayOfYear -> DayOfYear -> OrdinalDate
OrdinalDate DayOfYear
y DayOfYear
d
{-# INLINE fromOrdinalDateValid #-}
fromOrdinalDateValid :: Year -> DayOfYear -> Maybe Day
fromOrdinalDateValid :: DayOfYear -> DayOfYear -> Maybe Day
fromOrdinalDateValid DayOfYear
y DayOfYear
d = OrdinalDate -> Maybe Day
ordinalDateValid (DayOfYear -> DayOfYear -> OrdinalDate
OrdinalDate DayOfYear
y DayOfYear
d)
{-# INLINE sundayStartWeek #-}
sundayStartWeek :: Day -> (Year, WeekOfYear, DayOfWeek)
sundayStartWeek :: Day -> (DayOfYear, DayOfYear, DayOfYear)
sundayStartWeek (forall a s. Getting a s a -> s -> a
view Iso' Day SundayWeek
sundayWeek -> SundayWeek DayOfYear
y DayOfYear
w DayOfYear
d) = (DayOfYear
y, DayOfYear
w, DayOfYear
d)
{-# INLINE fromSundayStartWeek #-}
fromSundayStartWeek :: Year -> WeekOfYear -> DayOfWeek -> Day
fromSundayStartWeek :: DayOfYear -> DayOfYear -> DayOfYear -> Day
fromSundayStartWeek DayOfYear
y DayOfYear
w DayOfYear
d = Iso' Day SundayWeek
sundayWeek forall s t a b. AReview s t a b -> b -> t
# DayOfYear -> DayOfYear -> DayOfYear -> SundayWeek
SundayWeek DayOfYear
y DayOfYear
w DayOfYear
d
{-# INLINE fromSundayStartWeekValid #-}
fromSundayStartWeekValid :: Year -> WeekOfYear -> DayOfWeek -> Maybe Day
fromSundayStartWeekValid :: DayOfYear -> DayOfYear -> DayOfYear -> Maybe Day
fromSundayStartWeekValid DayOfYear
y DayOfYear
w DayOfYear
d = SundayWeek -> Maybe Day
sundayWeekValid (DayOfYear -> DayOfYear -> DayOfYear -> SundayWeek
SundayWeek DayOfYear
y DayOfYear
w DayOfYear
d)
{-# INLINE mondayStartWeek #-}
mondayStartWeek :: Day -> (Year, WeekOfYear, DayOfWeek)
mondayStartWeek :: Day -> (DayOfYear, DayOfYear, DayOfYear)
mondayStartWeek (forall a s. Getting a s a -> s -> a
view Iso' Day MondayWeek
mondayWeek -> MondayWeek DayOfYear
y DayOfYear
w DayOfYear
d) = (DayOfYear
y, DayOfYear
w, DayOfYear
d)
{-# INLINE fromMondayStartWeek #-}
fromMondayStartWeek :: Year -> WeekOfYear -> DayOfWeek -> Day
fromMondayStartWeek :: DayOfYear -> DayOfYear -> DayOfYear -> Day
fromMondayStartWeek DayOfYear
y DayOfYear
w DayOfYear
d = Iso' Day MondayWeek
mondayWeek forall s t a b. AReview s t a b -> b -> t
# DayOfYear -> DayOfYear -> DayOfYear -> MondayWeek
MondayWeek DayOfYear
y DayOfYear
w DayOfYear
d
{-# INLINE fromMondayStartWeekValid #-}
fromMondayStartWeekValid :: Year -> WeekOfYear -> DayOfWeek -> Maybe Day
fromMondayStartWeekValid :: DayOfYear -> DayOfYear -> DayOfYear -> Maybe Day
fromMondayStartWeekValid DayOfYear
y DayOfYear
w DayOfYear
d = MondayWeek -> Maybe Day
mondayWeekValid (DayOfYear -> DayOfYear -> DayOfYear -> MondayWeek
MondayWeek DayOfYear
y DayOfYear
w DayOfYear
d)