module Taskell.Data.Date.Types
    ( Deadline(..)
    , Due(..)
    ) where

import ClassyPrelude

data Due
    = DueTime UTCTime
    | DueDate Day
    deriving (Int -> Due -> ShowS
[Due] -> ShowS
Due -> String
(Int -> Due -> ShowS)
-> (Due -> String) -> ([Due] -> ShowS) -> Show Due
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Due] -> ShowS
$cshowList :: [Due] -> ShowS
show :: Due -> String
$cshow :: Due -> String
showsPrec :: Int -> Due -> ShowS
$cshowsPrec :: Int -> Due -> ShowS
Show, Due -> Due -> Bool
(Due -> Due -> Bool) -> (Due -> Due -> Bool) -> Eq Due
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Due -> Due -> Bool
$c/= :: Due -> Due -> Bool
== :: Due -> Due -> Bool
$c== :: Due -> Due -> Bool
Eq)

instance Ord Due where
    compare :: Due -> Due -> Ordering
compare (DueTime UTCTime
t) (DueDate Day
d)   = UTCTime
t UTCTime -> UTCTime -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Day -> DiffTime -> UTCTime
UTCTime Day
d DiffTime
0
    compare (DueDate Day
d) (DueTime UTCTime
t)   = Day -> DiffTime -> UTCTime
UTCTime Day
d DiffTime
0 UTCTime -> UTCTime -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` UTCTime
t
    compare (DueDate Day
d1) (DueDate Day
d2) = Day
d1 Day -> Day -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Day
d2
    compare (DueTime UTCTime
t1) (DueTime UTCTime
t2) = UTCTime
t1 UTCTime -> UTCTime -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` UTCTime
t2

data Deadline
    = Passed
    | Today
    | Tomorrow
    | ThisWeek
    | Plenty
    deriving (Int -> Deadline -> ShowS
[Deadline] -> ShowS
Deadline -> String
(Int -> Deadline -> ShowS)
-> (Deadline -> String) -> ([Deadline] -> ShowS) -> Show Deadline
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Deadline] -> ShowS
$cshowList :: [Deadline] -> ShowS
show :: Deadline -> String
$cshow :: Deadline -> String
showsPrec :: Int -> Deadline -> ShowS
$cshowsPrec :: Int -> Deadline -> ShowS
Show, Deadline -> Deadline -> Bool
(Deadline -> Deadline -> Bool)
-> (Deadline -> Deadline -> Bool) -> Eq Deadline
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Deadline -> Deadline -> Bool
$c/= :: Deadline -> Deadline -> Bool
== :: Deadline -> Deadline -> Bool
$c== :: Deadline -> Deadline -> Bool
Eq)