module Data.Time.Hora.Internal.DatePartSmall where
import Data.Binary
import Data.Time.Hora.Internal.Span
import GHC.Generics
import Prelude hiding (negate)
data DatePartSmall = Day Word32
| Min Word16
| Ms Word32
| Time Word16 Word32
| DatePartSmall Word32 Word16 Word32
| Day' Word32
| Min' Word16
| Ms' Word32
| Neg DatePartSmall
| Error ErrorDetail
deriving (Eq, Show, Generic)
toSpan::DatePartSmall -> DatePartSmall
toSpan dp0 = case dp0 of
Day d1 -> Day' d1
Min m1 -> Min' m1
Ms ms1 -> Ms' ms1
otherwise -> dp0
negate::DatePartSmall -> DatePartSmall
negate dp0 = case dp0 of
Neg dp1 -> dp1
Day' d1 -> Neg dp0
Min' m1 -> Neg dp0
Ms' ms1 -> Neg dp0
otherwise -> dp0
isNegative::DatePartSmall -> Bool
isNegative dp0 = case dp0 of
(Neg _) -> True
otherwise -> False
data ErrorDetail = Invalid
| Overflow
| Invalid_Overflow
deriving (Eq, Show, Generic)
instance Binary ErrorDetail
instance Binary DatePartSmall
instance Semigroup DatePartSmall where
(<>) (Day d0) (Time m0 ms0) = DatePartSmall d0 m0 ms0
(<>) (Min m0) (Ms ms0) = Time m0 ms0
(<>) d1@(DatePartSmall _ _ _) d2@(Day' _) = incrDecr (+) d1 d2
(<>) d1@(DatePartSmall d0 m0 ms0) d2@(Min' m1) = incrDecr (+) d1 d2
(<>) d1@(DatePartSmall d0 m0 ms0) d2@(Ms' ms1) = incrDecr (+) d1 d2
(<>) d1@(Time m0 ms0) d2@(Min' m1) = incrDecr (+) d1 d2
(<>) d1@(Time m0 ms0) d2@(Ms' ms1) = incrDecr (+) d1 d2
(<>) d1@(Day m0) d2@(Day' m1) = incrDecr (+) d1 d2
(<>) d1@(Min m0) d2@(Min' m1) = incrDecr (+) d1 d2
(<>) d1@(Ms m0) d2@(Ms' m1) = incrDecr (+) d1 d2
(<>) d1@(Day' m0) d2@(Day' m1) = incrDecr (+) d1 d2
(<>) d1@(Min' m0) d2@(Min' m1) = incrDecr (+) d1 d2
(<>) d1@(Ms' m0) d2@(Ms' m1) = incrDecr (+) d1 d2
(<>) (Neg d1) (Neg d2) = negate $ incrDecr (+) d1 d2
(<>) d1 (Neg d2) = incrDecr (-) d1 d2
(<>) (DatePartSmall _ _ _) (DatePartSmall d1 m1 ms1) = DatePartSmall d1 m1 ms1
(<>) (Time _ _) (Time m1 ms1) = Time m1 ms1
(<>) (Day _) (Day d1) = Day d1
(<>) (Min _) (Min m1) = Min m1
(<>) (Ms _) (Ms ms1) = Ms ms1
(<>) (DatePartSmall d0 _ _) (Time m1 ms1) = DatePartSmall d0 m1 ms1
(<>) (Time _ ms0) (Min m1) = Time m1 ms0
(<>) (Time m0 _) (Ms ms1) = Time m0 ms1
(<>) (Error Invalid) (Error Invalid) = Error Invalid
(<>) (Error Invalid) (Error Overflow) = Error Invalid_Overflow
(<>) (Error Overflow) (Error Overflow) = Error Overflow
(<>) (Error Overflow) (Error Invalid) = Error Invalid_Overflow
(<>) (Error Invalid_Overflow) _ = Error Invalid_Overflow
(<>) _ (Error Invalid_Overflow) = Error Invalid_Overflow
(<>) e0@(Error _) _ = e0
(<>) _ e0@(Error _) = e0
(<>) _ _ = Error Invalid
incrDecr::(Int -> Int -> Int)
-> DatePartSmall
-> DatePartSmall
-> DatePartSmall
incrDecr op0 dp1 dp2
| (DatePartSmall d0 m0 ms0) <- dp1,
(Day' d1) <- dp2
= checkOverflow
(\d2 -> DatePartSmall d2 m0 ms0) d0 op0 d1
| (DatePartSmall d0 m0 ms0) <- dp1,
(Min' m1) <- dp2
= checkOverflow
(\m2 -> DatePartSmall d0 m2 ms0) m0 op0 m1
| (DatePartSmall d0 m0 ms0) <- dp1,
(Ms' ms1) <- dp2
= checkOverflow
(DatePartSmall d0 m0) ms0 op0 ms1
| (Time m0 ms0) <- dp1,
(Min' m1) <- dp2
= checkOverflow (\m2 -> Time m2 ms0) m0 op0 m1
| (Time m0 ms0) <- dp1,
(Ms' ms1) <- dp2
= checkOverflow (Time m0) ms0 op0 ms1
| (Day m0) <- dp1,
(Day' m1) <- dp2
= checkOverflow Day m0 op0 m1
| (Min m0) <- dp1,
(Min' m1) <- dp2
= checkOverflow Min m0 op0 m1
| (Ms m0) <- dp1,
(Ms' m1) <- dp2
= checkOverflow Ms m0 op0 m1
| (Day' m0) <- dp1,
(Day' m1) <- dp2
= checkOverflow Day' m0 op0 m1
| (Min' m0) <- dp1,
(Min' m1) <- dp2
= checkOverflow Min' m0 op0 m1
| (Ms' m0) <- dp1,
(Ms' m1) <- dp2
= checkOverflow Ms' m0 op0 m1
| otherwise = Error Invalid
checkOverflow::forall a b. (Bounded a, Integral a, Num a) =>
(a -> DatePartSmall)
-> a
-> (Int -> Int -> Int)
-> a
-> DatePartSmall
checkOverflow ctor0 a1 op0 a2 =
if result1 >= min_aInt1
&& result1 <= max_aInt1
then ctor0 $ fi result1
else Error Overflow
where b1 = fi a1::Int
b2 = fi a2::Int
min_a1 = minBound::a
min_aInt1 = fi min_a1::Int
max_a1 = maxBound::a
max_aInt1 = fi max_a1::Int
result1 = op0 b1 b2::Int