X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/3fc0ed44dc2169d10a42f1c6f6ea39be7dc310dd..bb3e0cb61d1e09bdc3f4c08fdb752c727c0f79a3:/helpers.lua?ds=sidebyside

diff --git a/helpers.lua b/helpers.lua
index 08aba0d..4ece329 100644
--- a/helpers.lua
+++ b/helpers.lua
@@ -2,17 +2,18 @@
 --[[
                                                   
      Licensed under GNU General Public License v2 
-      * (c) 2013,      Luke Bonham                
-      * (c) 2010-2012, Peter Hofmann              
+      * (c) 2013, Luke Bonham                     
                                                   
 --]]
 
 local debug  = require("debug")
 
 local capi   = { timer = timer }
-local io     = { open = io.open,
-                 lines = io.lines }
+local io     = { open  = io.open,
+                 lines = io.lines,
+                 popen = io.popen }
 local rawget = rawget
+local table  = { sort   = table.sort }
 
 -- Lain helper functions for internal use
 -- lain.helpers
@@ -33,20 +34,23 @@ end
 
 -- {{{ File operations
 
--- see if the file exists
+-- see if the file exists and is readable
 function helpers.file_exists(file)
-  local f = io.open(file, "rb")
-  if f then f:close() end
+  local f = io.open(file)
+  if f then
+      local s = f:read()
+      f:close()
+      f = s
+  end
   return f ~= nil
 end
 
-
--- get all lines from a file, returns an empty 
+-- get all lines from a file, returns an empty
 -- list/table if the file does not exist
 function helpers.lines_from(file)
   if not helpers.file_exists(file) then return {} end
   lines = {}
-  for line in io.lines(file) do 
+  for line in io.lines(file) do
     lines[#lines + 1] = line
   end
   return lines
@@ -61,8 +65,8 @@ end
 -- get first non empty line from a file,
 -- returns nil otherwise
 function helpers.first_nonempty_line(file)
-  for k,v in pairs(lines_from(file)) do
-    if #v then return v end 
+  for k,v in pairs(helpers.lines_from(file)) do
+    if #v then return v end
   end
   return nil
 end
@@ -84,6 +88,18 @@ end
 
 -- }}}
 
+-- {{{ Pipe operations
+
+-- read the full output of a pipe (command)
+function helpers.read_pipe(cmd)
+   local f = assert(io.popen(cmd))
+   local output = f:read("*all")
+   f:close()
+   return output
+end
+
+-- }}}
+
 -- {{{ A map utility
 
 helpers.map_table = {}
@@ -98,4 +114,23 @@ end
 
 -- }}}
 
+--{{{ Iterate over table of records sorted by keys
+function helpers.spairs(t)
+    -- collect the keys
+    local keys = {}
+    for k in pairs(t) do keys[#keys+1] = k end
+
+    table.sort(keys)
+
+    -- return the iterator function
+    local i = 0
+    return function()
+        i = i + 1
+        if keys[i] then
+            return keys[i], t[keys[i]]
+        end
+    end
+end
+--}}}
+
 return helpers