Search code examples
datepurescript

Getting the date of the next day in PureScript


Is there anyway to write the following function more elegantly?

I can see some patterns but I'm not sure how to abstract them or how to find a simpler way to write the function.

type HasRemainder = Boolean

tomorrow :: Date -> Date
tomorrow date = unsafePartial $ canonicalDate y (fst m) (fst d)
  where d :: Tuple Day HasRemainder
        d = case toEnum $ 1 + fromEnum (day date) of
          Just v -> Tuple v false
          Nothing -> Tuple (unsafePartial $ fromJust $ toEnum 1) true
        m :: Tuple Month HasRemainder
        m = if snd d then
              case toEnum $ 1 + fromEnum (month date) of
                Just v -> Tuple v false
                Nothing -> Tuple (unsafePartial $ fromJust $ toEnum 1) true
            else Tuple (month date) false
        y :: Year
        y = if snd m then
              case toEnum $ 1 + fromEnum (year date) of
                Just v -> v
                -- use 2018 arbitrarly if the conversion from int to Date fails
                Nothing -> unsafePartial $ fromJust $ toEnum 2018
            else (year date)

Solution

  • I'd do something like this:

    import Data.DateTime as DT
    import Data.Maybe (maybe)
    import Data.Time.Duration (Days(..))
    
    tomorrow :: DT.Date -> DT.Date
    tomorrow dt = maybe dt DT.date $ DT.adjust (Days 1.0) (DT.DateTime dt bottom)
    

    Although it will return the input date in the unlikely event that the given date is top (which is 31st December 275759 if I remember correctly).

    There is an adjust function for Time and DateTime so it's just an oversight that Date is missing one.