module Common.View.Format ( shortDay , longDay , price , number ) where import Data.List (intersperse) import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text as T import Data.Time.Calendar (Day, toGregorian) import Common.Model (Currency (..)) import qualified Common.Msg as Msg shortDay :: Day -> Text shortDay date = Msg.get $ Msg.Date_Short day month (fromIntegral year) where (year, month, day) = toGregorian date longDay :: Day -> Text longDay date = Msg.get $ Msg.Date_Long day (fromMaybe "−" . fmap Msg.get . monthToKey $ month) (fromIntegral year) where (year, month, day) = toGregorian date monthToKey 1 = Just Msg.Month_January monthToKey 2 = Just Msg.Month_February monthToKey 3 = Just Msg.Month_March monthToKey 4 = Just Msg.Month_April monthToKey 5 = Just Msg.Month_May monthToKey 6 = Just Msg.Month_June monthToKey 7 = Just Msg.Month_July monthToKey 8 = Just Msg.Month_August monthToKey 9 = Just Msg.Month_September monthToKey 10 = Just Msg.Month_October monthToKey 11 = Just Msg.Month_November monthToKey 12 = Just Msg.Month_December monthToKey _ = Nothing price :: Currency -> Int -> Text price (Currency currency) amount = T.concat [ number amount, " ", currency ] number :: Int -> Text number n = T.pack . (++) (if n < 0 then "-" else "") . reverse . concat . intersperse " " . group 3 . reverse . show . abs $ n group :: Int -> [a] -> [[a]] group n xs = if length xs <= n then [xs] else (take n xs) : (group n (drop n xs))