2017-02-02 31 views
0

Есть ли способ написать следующую функцию более элегантно?Получение даты на следующий день в PureScript

Я могу видеть некоторые шаблоны, но я не уверен, как их абстрагировать или как найти более простой способ написать функцию.

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) 

ответ

4

Я хотел бы сделать что-то вроде этого:

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) 

Хотя это будет верните дату ввода в маловероятном случае, когда данная дата равна top (которая 31 декабря 275 759, если я правильно помню).

Существует adjust функция Time и DateTime так это просто упущение, что Date отсутствует один.

0

Я хотел бы попробовать что-то вдоль этих линий

getDatePart datepart defaultval1 defaultval2 = 
    case toEnum $ defaultval1 + fromEnum datepart of 
    Just v -> Tuple v false 
    Nothing -> Tuple (unsafePartial $ fromJust $ toEnum defaultval2) true 

getDatePartDefault d datepart defaultval1 defaultval2 = 
    if snd d then 
     getDatePart datepart defaultval1 defaultval2 
    else Tuple datepart false 


tomorrow :: Date -> Date 
tomorrow date = unsafePartial $ canonicalDate (fst y) (fst m) (fst d) 
    where d :: Tuple Day HasRemainder 
      d = getDatePart (day date) 1 1 
      m :: Tuple Month HasRemainder 
      m = getDatePartDefault d (month date) 1 1 
      y :: Tuple Year HasRemainder 
      y = getDatePartDefault d (year date) 1 2018 

Позаботьтесь: это не тестируется