{-# LANGUAGE MagicHash #-} module Hcompta.Format.Ledger.Date.Write where import Data.Char (Char) import Data.Eq (Eq(..)) import Data.Ord (Ord(..)) import qualified Data.Text as Text import qualified Data.Time.LocalTime as Time import GHC.Exts (Int(..)) import GHC.Integer.Logarithms (integerLogBase#) import Prelude (($), (.), Integer, Num(..), RealFrac(..), Show(..)) import Hcompta.Date (Date) import qualified Hcompta.Date as Date import Hcompta.Lib.Leijen (Doc, (<>)) import qualified Hcompta.Lib.Leijen as W -- * Write 'Date' date :: Date -> Doc date dat = do let (y, mo, d) = Date.gregorian dat (if y == 0 then W.empty else W.integer y <> sep '/') <> do int2 mo <> do sep '/' <> int2 d <> do (case Date.tod dat of Time.TimeOfDay 0 0 0 -> W.empty Time.TimeOfDay h m s -> sep '_' <> int2 h <> do sep ':' <> int2 m <> do (case s of 0 -> W.empty _ -> sep ':' <> do (if s < 10 then W.char '0' else W.empty) <> do W.strict_text $ Text.pack $ show $ (truncate s::Integer))) -- (case tz_min of -- 0 -> W.empty -- _ | tz_name /= "" -> W.space <> do W.strict_text $ Text.pack tz_name -- _ -> W.space <> do W.strict_text $ Text.pack $ Time.timeZoneOffsetString tz) where int2 :: Int -> Doc int2 i = if i < 10 then W.char '0' <> W.int i else W.int i sep :: Char -> Doc sep = W.bold . W.dullblack . W.char -- ** Measure 'Date' date_length :: Date -> Int date_length dat = do let (y, _, _) = Date.gregorian dat (case y of 0 -> 0 _ -> (if y < 0 then 1 else 0) -- sign + (1 + (I# (integerLogBase# 10 (abs y)))) -- year + 1) -- / + 2 -- month + 1 -- / + 2 -- dom + (case Date.tod dat of Time.TimeOfDay 0 0 0 -> 0 Time.TimeOfDay _ _ s -> 1 -- _ + 2 -- hour + 1 -- : + 2 -- min + (case s of 0 -> 0 _ -> 1 + 2 -- : sec ) )