calendar.elapsed: Support relative times in the future with "3 hours hence" etc.
Add unix-time>relative-time word for convenience.db4
parent
4e672304b7
commit
3281541d85
|
@ -13,8 +13,6 @@ IN: calendar.elapsed.test
|
||||||
{ "1m 1s" } [ 61 elapsed-time ] unit-test
|
{ "1m 1s" } [ 61 elapsed-time ] unit-test
|
||||||
{ "2y 1w 6d 2h 59m 23s" } [ 64033163 elapsed-time ] unit-test
|
{ "2y 1w 6d 2h 59m 23s" } [ 64033163 elapsed-time ] unit-test
|
||||||
|
|
||||||
[ -1 relative-time ] [ "negative seconds" = ] must-fail-with
|
|
||||||
|
|
||||||
{ "just now" } [ 0 relative-time ] unit-test
|
{ "just now" } [ 0 relative-time ] unit-test
|
||||||
{ "less than a minute ago" } [ 10 relative-time ] unit-test
|
{ "less than a minute ago" } [ 10 relative-time ] unit-test
|
||||||
{ "about a minute ago" } [ 60 relative-time ] unit-test
|
{ "about a minute ago" } [ 60 relative-time ] unit-test
|
||||||
|
|
|
@ -26,22 +26,42 @@ M: real elapsed-time
|
||||||
M: duration elapsed-time
|
M: duration elapsed-time
|
||||||
duration>seconds elapsed-time ;
|
duration>seconds elapsed-time ;
|
||||||
|
|
||||||
|
! XXX: Anything up to 2 hours is "about an hour"
|
||||||
|
: relative-time-offset ( seconds -- string )
|
||||||
|
abs {
|
||||||
|
{ [ dup 1 < ] [ drop "just now" ] }
|
||||||
|
{ [ dup 60 < ] [ drop "less than a minute" ] }
|
||||||
|
{ [ dup 120 < ] [ drop "about a minute" ] }
|
||||||
|
{ [ dup 2700 < ] [ 60 / "%d minutes" sprintf ] }
|
||||||
|
{ [ dup 7200 < ] [ drop "about an hour" ] }
|
||||||
|
{ [ dup 86400 < ] [ 3600 /i "%d hours" sprintf ] }
|
||||||
|
{ [ dup 172800 < ] [ drop "1 day" ] }
|
||||||
|
[ 86400 / "%d days" sprintf ]
|
||||||
|
} cond ;
|
||||||
|
|
||||||
GENERIC: relative-time ( seconds -- string )
|
GENERIC: relative-time ( seconds -- string )
|
||||||
|
|
||||||
M: real relative-time
|
M: real relative-time
|
||||||
dup 0 < [ "negative seconds" throw ] when {
|
[ relative-time-offset ] [
|
||||||
{ [ dup 1 < ] [ drop "just now" ] }
|
dup abs 1 < [
|
||||||
{ [ dup 60 < ] [ drop "less than a minute ago" ] }
|
drop
|
||||||
{ [ dup 120 < ] [ drop "about a minute ago" ] }
|
] [
|
||||||
{ [ dup 2700 < ] [ 60 / "%d minutes ago" sprintf ] }
|
0 < "hence" "ago" ? " " glue
|
||||||
{ [ dup 5400 < ] [ drop "about an hour ago" ] }
|
] if
|
||||||
{ [ dup 86400 < ] [ 3600 / "%d hours ago" sprintf ] }
|
] bi ;
|
||||||
{ [ dup 172800 < ] [ drop "1 day ago" ] }
|
|
||||||
[ 86400 / "%d days ago" sprintf ]
|
|
||||||
} cond ;
|
|
||||||
|
|
||||||
M: duration relative-time
|
M: duration relative-time
|
||||||
duration>seconds relative-time ;
|
duration>seconds relative-time ;
|
||||||
|
|
||||||
M: timestamp relative-time
|
M: timestamp relative-time
|
||||||
now swap time- relative-time ;
|
now swap time- relative-time ;
|
||||||
|
|
||||||
|
|
||||||
|
GENERIC: unix-time>relative-time ( unix-seconds -- string )
|
||||||
|
|
||||||
|
M: real unix-time>relative-time
|
||||||
|
seconds since-1970 unix-time>relative-time ;
|
||||||
|
|
||||||
|
M: timestamp unix-time>relative-time
|
||||||
|
[ now ] dip
|
||||||
|
time- duration>seconds relative-time ;
|
||||||
|
|
Loading…
Reference in New Issue