module Data.Time.Hora.Type.DmyHm where

import GHC.Generics
import Data.Binary
import Data.Fixed
import qualified Data.Time.Hora.Type.YmdHms as S


-- | Date, Time w/out second
data DmyHm a = DmyHm {
    day::a,
    month::a,
    year::a,
    hour::a,
    minute::a
    } deriving (Show, Eq)


instance Functor DmyHm where
    fmap f0 d0 = d0 {
            day = f0 (day d0),
            month = f0 (month d0),
            year = f0 (year d0),
            hour = f0 (hour d0),
            minute = f0 (minute d0)
        } 


-- | @(DmyHm {day = "12", month = "12", year = "2016", hour = "17", minute = "32"},"59.727280400000")@
type DmyHmp' = (DmyHm String, String)    --  dmyhm


-- | @DmyHmp (DmyHm {day = 12, month = 12, year = 2016, hour = 17, minute = 32},59.727482058000)@
newtype DmyHmp = DmyHmp (DmyHm Int, Pico) deriving (Eq, Show, Generic)  --  dmyhm, pico

deriving instance Generic (DmyHm Int)
instance Binary (DmyHm Int)
instance Binary DmyHmp

{- | convert from more precise to more common type -}
pico2second::DmyHmp -> S.YmdHms
pico2second (DmyHmp (r0,pico0)) = S.YmdHms {
    S.year = year r0,
    S.month = month r0,
    S.day = day r0,
    S.hour = hour r0,
    S.minute = minute r0,
    S.second = round pico0
    }
    

instance Ord DmyHmp where
    (<=) (DmyHmp(a1,p1)) (DmyHmp(a2,p2)) = 
        if a1 <= a2 then p1 <= p2
        else False


instance Ord (DmyHm Int) where
    (<=) a0 b0 = not $  
        year a0 > (year b0)
        || month a0 > (month b0)
        || day a0 > (day b0)
        || hour a0 > (hour b0)
        || minute a0 > (minute b0)