Explorar el Código

introduce a relative time data structure

it supports times in the future, but also makes the code less pretty...

(it could also support different formatters.)
Lucas Stadler %!s(int64=11) %!d(string=hace) años
padre
commit
efc430cea4
Se han modificado 1 ficheros con 50 adiciones y 10 borrados
  1. 50 10
      elm/PrettyDate.elm

+ 50 - 10
elm/PrettyDate.elm

@ -8,10 +8,44 @@ prettyDate reference date =
8 8
    let referenceSeconds = Date.toTime reference
9 9
        dateSeconds = Date.toTime date
10 10
        diffSeconds = referenceSeconds - dateSeconds
11
    in format diffSeconds
11
    in format << toRelativeTime <| diffSeconds
12 12
13
format : Float -> String
14
format diff =
13
type RelativeTime = JustNow
14
                  | Minute Int
15
                  | Hour Int
16
                  | Day Int
17
                  | Week Int
18
                  | Month Int
19
                  | Year Int
20
                  | Future RelativeTime
21
22
format : RelativeTime -> String
23
format relativeTime =
24
    case relativeTime of
25
      JustNow -> "moments ago"
26
      Minute 1 -> "a minute ago"
27
      Minute n -> toString n ++ " minutes ago"
28
      Hour 1 -> "hour ago"
29
      Hour n -> toString n ++ " hours ago"
30
      Day 1 -> "a day ago"
31
      Day n -> toString n ++ " years ago"
32
      Week 1 -> "a week ago"
33
      Week n -> toString n ++ " weeks ago"
34
      Month 1 -> "a month ago"
35
      Month n -> toString n ++ " months ago"
36
      Year 1 -> "a year ago"
37
      Year n -> toString n ++ "years ago"
38
      Future (JustNow) -> "in a moment"
39
      Future (Minute n) -> "in " ++ toString n ++ " hours"
40
      Future (Hour n) -> "in " ++ toString n ++ " hours"
41
      Future (Day n) -> "in " ++ toString n ++ " days"
42
      Future (Week n) -> "in " ++ toString n ++ " weeks"
43
      Future (Month n) -> "in " ++ toString n ++ " months"
44
      Future (Year n) -> "in " ++ toString n ++ " years"
45
      _ -> "???"
46
47
toRelativeTime : Float -> RelativeTime
48
toRelativeTime origDiff =
15 49
    let minute = 60 * 1000
16 50
        hour = 60 * minute
17 51
        day = 24 * hour
@ -19,10 +53,16 @@ format diff =
19 53
        month = 31 * day
20 54
        year = 365 * day
21 55
        roundToString = toString << ceiling
22
    in if | diff < minute -> "moments ago"
23
          | diff < hour   -> roundToString (diff / minute) ++ " minutes ago"
24
          | diff < day    -> roundToString (diff / hour)   ++ " hours ago"
25
          | diff < week   -> roundToString (diff / day)    ++ " days ago"
26
          | diff < month  -> roundToString (diff / week)   ++ " weeks ago"
27
          | diff < year   -> roundToString (diff / month)  ++ " months ago"
28
          | otherwise     -> roundToString (diff / year)   ++ " years ago"
56
        inThePast = origDiff > 0
57
        diff = abs origDiff
58
        relativeTime =
59
            if | diff < minute -> JustNow
60
               | diff < hour   -> Minute <| round (diff / minute)
61
               | diff < day    -> Hour <| round (diff / hour)
62
               | diff < week   -> Day <| round (diff / day)
63
               | diff < month  -> Week <| round (diff / week)
64
               | diff < year   -> Month <| round (diff / month)
65
               | otherwise     -> Year <| round (diff / year)
66
    in if inThePast
67
       then relativeTime
68
       else Future relativeTime