]>
git.madduck.net Git - etc/awesome.git/blobdiff - src/timetable.lua
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
+local strformat = string.format
local floor = math.floor
local function idiv ( n , d )
return floor ( n / d )
local floor = math.floor
local function idiv ( n , d )
return floor ( n / d )
end
local function month_length ( m , y )
end
local function month_length ( m , y )
if m == 2 then
return is_leap ( y ) and 29 or 28
else
if m == 2 then
return is_leap ( y ) and 29 or 28
else
assert ( tm.day , "day required" ) ,
tm.hour or 12 ,
tm.min or 0 ,
assert ( tm.day , "day required" ) ,
tm.hour or 12 ,
tm.min or 0 ,
+ tm.sec or 0 ,
+ tm.yday ,
+ tm.wday
end
-- Modify parameters so they all fit within the "normal" range
end
-- Modify parameters so they all fit within the "normal" range
-- Each leap year adds one day
+ ( leap_years_since ( year - 1 ) - leap_years_since_1970 ) - 1
-- Each leap year adds one day
+ ( leap_years_since ( year - 1 ) - leap_years_since_1970 ) - 1
- return days_since_epoch * 60*60*24
+ return days_since_epoch * (60*60*24)
+ hour * (60*60)
+ min * 60
+ sec
+ hour * (60*60)
+ min * 60
+ sec
return strformat ( "%04u-%02u-%02uT%02u:%02u:%06.4g" , unpack_tm ( self ) )
end
return strformat ( "%04u-%02u-%02uT%02u:%02u:%06.4g" , unpack_tm ( self ) )
end
+local timetable_mt
+
+local function coerce_arg ( t )
+ if getmetatable ( t ) == timetable_mt then
+ return t:timestamp ( )
+ end
+ return t
+end
+
+timetable_mt = {
__index = timetable_methods ;
__tostring = timetable_methods.rfc_3339 ;
__eq = function ( a , b )
__index = timetable_methods ;
__tostring = timetable_methods.rfc_3339 ;
__eq = function ( a , b )
- return a:timestamp() == b:timestamp( )
+ return coerce_arg ( a ) == coerce_arg ( b )
end ;
__lt = function ( a , b )
end ;
__lt = function ( a , b )
- return a:timestamp() < b:timestamp( )
+ return coerce_arg ( a ) < coerce_arg ( b )
return setmetatable ( tm , timetable_mt )
end
return setmetatable ( tm , timetable_mt )
end
-local function new_timetable ( year , month , day , hour , min , sec )
+local function new_timetable ( year , month , day , hour , min , sec , yday , wday )
return cast_timetable {
year = year ;
month = month ;
return cast_timetable {
year = year ;
month = month ;
hour = hour ;
min = min ;
sec = sec ;
hour = hour ;
min = min ;
sec = sec ;
+ yday = yday ;
+ wday = wday ;
+function timetable_methods:clone ( )
+ return new_timetable ( unpack_tm ( self ) )
+end
+
+local function new_from_timestamp ( ts )
+ return new_timetable ( 1970 , 1 , 1 , 0 , 0 , ts )
+end
+
return {
doomsday = doomsday ;
normalise = normalise ;
timestamp = timestamp ;
new = new_timetable ;
return {
doomsday = doomsday ;
normalise = normalise ;
timestamp = timestamp ;
new = new_timetable ;
+ new_from_timestamp = new_from_timestamp ;
cast = cast_timetable ;
timetable_mt = timetable_mt ;
}
cast = cast_timetable ;
timetable_mt = timetable_mt ;
}