Przeglądaj źródła

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 lat temu
rodzic
commit
efc430cea4
1 zmienionych plików z 50 dodań i 10 usunięć
  1. 50 10
      elm/PrettyDate.elm

+ 50 - 10
elm/PrettyDate.elm

8
    let referenceSeconds = Date.toTime reference
8
    let referenceSeconds = Date.toTime reference
9
        dateSeconds = Date.toTime date
9
        dateSeconds = Date.toTime date
10
        diffSeconds = referenceSeconds - dateSeconds
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
    let minute = 60 * 1000
49
    let minute = 60 * 1000
16
        hour = 60 * minute
50
        hour = 60 * minute
17
        day = 24 * hour
51
        day = 24 * hour
19
        month = 31 * day
53
        month = 31 * day
20
        year = 365 * day
54
        year = 365 * day
21
        roundToString = toString << ceiling
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