OSDN Git Service

Version 0.6.x starting.
[pettanr/clientJs.git] / 0.6.x / js / core / 06_XTimer.js
1 /**\r
2  * use X.Callback\r
3  */\r
4 \r
5 X.Timer = ( function(){\r
6         var setTimeout     = window.setTimeout;\r
7         var clearTimeout   = window.clearTimeout;\r
8         var INTERVAL_TIME  = 16;\r
9         var TICKET_LIST    = [];\r
10         var timerId        = -1;\r
11         var next           = 0;\r
12         /* const */\r
13         var INDEX_TIME     = 0,\r
14                 INDEX_LAST     = 1,\r
15                 INDEX_COUNT    = 2,\r
16                 INDEX_CALLBACK = 3;\r
17         \r
18         function loop(){\r
19                 var i    = 0,\r
20                         c    = next,\r
21                         list = TICKET_LIST,\r
22                         queue, callback;\r
23             for( ; i < list.length; ){\r
24                 queue = list[ i ];\r
25                         if( 0 < ( queue[ INDEX_LAST ] -= c ) ){\r
26                                 ++i;\r
27                                 continue;\r
28                         };\r
29                         callback = queue[ INDEX_CALLBACK ];\r
30                         c        = queue[ INDEX_COUNT ];\r
31                         if( callback() === false || c === 1 ){\r
32                                 list.splice( i, 1 );\r
33                                 callback.kill();\r
34                                 queue.length = 0;\r
35                                 continue;\r
36                         } else\r
37                         if( 1 < c ){\r
38                                 --queue[ INDEX_COUNT ];\r
39                         };\r
40                         ++i;\r
41                         queue[ INDEX_LAST ] = queue[ INDEX_TIME ];\r
42             };\r
43             timerId = -1;\r
44             update();\r
45         };\r
46         function update(){\r
47                 var list = TICKET_LIST,\r
48                         l    = list.length,\r
49                         n    = 99999999,\r
50                         last;\r
51                 if( l === 0 ){\r
52                         timerId !== -1 && clearTimeout( timerId );\r
53                         timerId = -1;\r
54                         return;\r
55                 };\r
56             for( ; l; ){\r
57                 last = list[ --l ][ INDEX_LAST ];\r
58                 if( last < n ) n = last;\r
59             };\r
60             if( n < next || timerId === -1 ){\r
61                 timerId !== -1 && clearTimeout( timerId );\r
62                 timerId = setTimeout( loop, INTERVAL_TIME * n );\r
63                 next = n;\r
64             };\r
65         };\r
66         \r
67         return {\r
68                 add : function( time, count, args1, args2, args3 ){\r
69                         if( time < INTERVAL_TIME ) time = INTERVAL_TIME;\r
70                         time = Math.floor( time / INTERVAL_TIME );\r
71                         var callback,\r
72                                 list     = TICKET_LIST,\r
73                                 l        = list.length,\r
74                                 i        = l,\r
75                                 queue, args;\r
76                         if( typeof count !== 'number' || count < 0 ){\r
77                                 count = 0;\r
78                         };\r
79                         /*\r
80                         for( ; i; ){\r
81                                 queue = list[ --i ];\r
82                                 if( queue[ INDEX_CALLBACK ].same( args1, args2 ) === true ){\r
83                                         queue[ INDEX_TIME  ] = queue[ INDEX_LAST ] = time;\r
84                                         queue[ INDEX_COUNT ] = count;\r
85                                         update();\r
86                                         return;\r
87                                 };\r
88                         }; */           \r
89 \r
90                         list[ l ] = [ time, time, count, X.Callback.create( args1, args2, args3 ) ];\r
91                     update();\r
92                 },\r
93                 once : function( time, args1, args2, args3 ){\r
94                         X.Timer.add( time, 1, args1, args2, args3 );\r
95                 },\r
96                 remove : function( args1, args2 ){\r
97                         var queue,\r
98                                 i    = 0,\r
99                                 list = TICKET_LIST;\r
100                         if( !callback ) return;\r
101                         while( queue = list[ i ] ){\r
102                                 if( queue[ INDEX_CALLBACK ].same( args1, args2 ) === true ){\r
103                                         callback.kill();\r
104                                         list.splice( i, 1 );\r
105                                         break;\r
106                                 } else {\r
107                                         ++i;\r
108                                 };\r
109                         };\r
110                     update();\r
111                 }\r
112         };\r
113 })();