Sfoglia il codice sorgente

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 11 anni fa
parent
commit
efc430cea4
1 ha cambiato i file con 50 aggiunte e 10 eliminazioni
  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