Advertisement
Anaristos

queueman

Nov 5th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.23 KB | None | 0 0
  1. queueman = {}
  2. --
  3. function queueman.ctor()
  4. --
  5.     local self = {}
  6.  
  7.     local queue = { first = 0, last = -1 }
  8.  
  9.     function self.pushleft( value )
  10.       local first = queue.first - 1
  11.       queue.first = first
  12.       queue[first] = value
  13.     end
  14.  
  15.     function self.pushright( value )
  16.       local last = queue.last + 1
  17.       queue.last = last
  18.       queue[last] = value
  19.     end
  20.  
  21.     function self.popleft()
  22.       local first = queue.first
  23.       if first > queue.last then return nil end
  24.       local value = queue[first]
  25.       queue[first] = nil        -- to allow garbage collection
  26.       queue.first = first + 1
  27.       return value
  28.     end
  29.  
  30.     function self.popright()
  31.       local last = queue.last
  32.       if queue.first > last then return nil end
  33.       local value = queue[last]
  34.       queue[last] = nil         -- to allow garbage collection
  35.       queue.last = last - 1
  36.       return value
  37.     end
  38.  
  39.     function self.peekleft()
  40.       local first = queue.first
  41.       if first <= queue.last then return queue[first] end
  42.       return nil
  43.     end
  44.  
  45.     function self.peekright()
  46.       local last = queue.last
  47.       if queue.first <= last then return queue[last] end
  48.       return nil
  49.     end
  50.  
  51.     function self.skipleft()
  52.       local first = queue.first
  53.       if first <= queue.last then
  54.         queue[first] = nil        -- to allow garbage collection
  55.         queue.first = first + 1
  56.       end
  57.     end
  58.  
  59.     function self.skipright()
  60.       local last = queue.last
  61.       if queue.first <= last then
  62.         queue[last] = nil         -- to allow garbage collection
  63.         queue.last = last - 1
  64.       end
  65.     end
  66.        
  67.     function self.clear()
  68.         queue = { first = 0, last = -1 }
  69.     end
  70.    
  71.     function self.getfirst()
  72.         return queue.first
  73.     end
  74.    
  75.     function self.getlast()
  76.         return queue.last
  77.     end
  78.  
  79.     function self.list()
  80.  
  81.         local wrap, yield = coroutine.wrap, coroutine.yield
  82.        
  83.         local i, k = 1, queue.first
  84.  
  85.         local function iterator( i, k )          
  86.                   while k <= queue.last
  87.                       do
  88.                           yield( i, queue[k] )
  89.                           i = i + 1
  90.                           k = k + 1
  91.                       end
  92.               end
  93.        
  94.         return wrap( function() iterator( i, k ) end )
  95.    
  96.     end
  97.  
  98.     return self
  99.  
  100. end
  101. --
  102. setmetatable( queueman, { __call = function( _, ... ) return queueman.ctor( ... ) end } )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement