{-# 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 = Day
forall a. Bounded a => a
minBound Day -> Getting OrdinalDate Day OrdinalDate -> OrdinalDate
forall s a. s -> Getting a s a -> a
^. Getting OrdinalDate Day OrdinalDate
Iso' Day OrdinalDate
ordinalDate
maxBound :: OrdinalDate
maxBound = Day
forall a. Bounded a => a
maxBound Day -> Getting OrdinalDate Day OrdinalDate -> OrdinalDate
forall s a. s -> Getting a s a -> a
^. Getting OrdinalDate Day OrdinalDate
Iso' Day OrdinalDate
ordinalDate
instance Random OrdinalDate where
randomR :: forall g.
RandomGen g =>
(OrdinalDate, OrdinalDate) -> g -> (OrdinalDate, g)
randomR = Iso' Day OrdinalDate
-> (OrdinalDate, OrdinalDate) -> g -> (OrdinalDate, g)
forall s g a.
(Random s, RandomGen g) =>
Iso' s a -> (a, a) -> g -> (a, g)
randomIsoR Overloaded p f Day Day OrdinalDate OrdinalDate
Iso' Day OrdinalDate
ordinalDate
random :: forall g. RandomGen g => g -> (OrdinalDate, g)
random = (Day -> OrdinalDate) -> (Day, g) -> (OrdinalDate, g)
forall b c d. (b -> c) -> (b, d) -> (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (Day -> Getting OrdinalDate Day OrdinalDate -> OrdinalDate
forall s a. s -> Getting a s a -> a
^. Getting OrdinalDate Day OrdinalDate
Iso' Day OrdinalDate
ordinalDate) ((Day, g) -> (OrdinalDate, g))
-> (g -> (Day, g)) -> g -> (OrdinalDate, g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g -> (Day, g)
forall g. RandomGen g => g -> (Day, g)
forall a g. (Random a, RandomGen g) => g -> (a, g)
random
instance Arbitrary OrdinalDate where
arbitrary :: Gen OrdinalDate
arbitrary = Getting OrdinalDate Day OrdinalDate -> Day -> OrdinalDate
forall a s. Getting a s a -> s -> a
view Getting OrdinalDate Day OrdinalDate
Iso' Day OrdinalDate
ordinalDate (Day -> OrdinalDate) -> Gen Day -> Gen OrdinalDate
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Day
forall a. Arbitrary a => Gen a
arbitrary
shrink :: OrdinalDate -> [OrdinalDate]
shrink OrdinalDate
od = Getting OrdinalDate Day OrdinalDate -> Day -> OrdinalDate
forall a s. Getting a s a -> s -> a
view Getting OrdinalDate Day OrdinalDate
Iso' Day OrdinalDate
ordinalDate (Day -> OrdinalDate) -> [Day] -> [OrdinalDate]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Day -> [Day]
forall a. Arbitrary a => a -> [a]
shrink (Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
Iso' Day OrdinalDate
ordinalDate Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
-> OrdinalDate -> Day
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) = DayOfYear -> Gen b -> Gen b
forall b. DayOfYear -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary DayOfYear
y (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfYear -> Gen b -> Gen b
forall b. DayOfYear -> Gen b -> Gen b
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) = Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
Iso' Day OrdinalDate
ordinalDate Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
-> OrdinalDate -> Day
forall s t a b. AReview s t a b -> b -> t
# OrdinalDate
od
Day -> Maybe () -> Maybe Day
forall a b. a -> Maybe b -> Maybe a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (DayOfYear
1 DayOfYear -> DayOfYear -> Bool
forall a. Ord a => a -> a -> Bool
<= DayOfYear
d Bool -> Bool -> Bool
&& DayOfYear
d DayOfYear -> DayOfYear -> Bool
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 (Getting OrdinalDate Day OrdinalDate -> Day -> OrdinalDate
forall a s. Getting a s a -> s -> a
view Getting OrdinalDate Day OrdinalDate
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 = Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
Iso' Day OrdinalDate
ordinalDate Overloaded Reviewed Identity Day Day OrdinalDate OrdinalDate
-> OrdinalDate -> Day
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 (Getting SundayWeek Day SundayWeek -> Day -> SundayWeek
forall a s. Getting a s a -> s -> a
view Getting SundayWeek Day SundayWeek
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 = Overloaded Reviewed Identity Day Day SundayWeek SundayWeek
Iso' Day SundayWeek
sundayWeek Overloaded Reviewed Identity Day Day SundayWeek SundayWeek
-> SundayWeek -> Day
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 (Getting MondayWeek Day MondayWeek -> Day -> MondayWeek
forall a s. Getting a s a -> s -> a
view Getting MondayWeek Day MondayWeek
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 = Overloaded Reviewed Identity Day Day MondayWeek MondayWeek
Iso' Day MondayWeek
mondayWeek Overloaded Reviewed Identity Day Day MondayWeek MondayWeek
-> MondayWeek -> Day
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)