scan.lua

changeset 7
038275cd92ed
parent 3
b2df1b3f2c83
child 26
77cd7b8fb6a6
equal deleted inserted replaced
6:219d7a7304f8 7:038275cd92ed
1 1
2 module("scan", package.seeall) 2 --@module scan
3 local scan={}
3 4
4 require('lfs') 5 local lfs=require('lfs')
5 require('path') 6 local path=require('path')
6 7
7 local function filtered_dir(d) 8 local function filtered_dir(d)
8 local f, s_, v_ = lfs.dir(d) 9 local f, s_, v_ = lfs.dir(d)
9 local function g(s, v) 10 local function g(s, v)
10 while true do 11 while true do
15 end 16 end
16 end 17 end
17 return g, s_, v_ 18 return g, s_, v_
18 end 19 end
19 20
20 function scan(d) 21 function scan.scan(d)
21 local h={} 22 local h={}
22 for f in filtered_dir(d) do 23 for f in filtered_dir(d) do
23 local n=d..'/'..f 24 local n=d..'/'..f
24 local a=lfs.attributes(n) 25 local a=lfs.attributes(n)
25 if a.mode=='directory' then 26 if a.mode=='directory' then
26 local nh=scan(n) 27 local nh=scan.scan(n)
27 h[f]=nh 28 h[f]=nh
28 elseif a.mode=='file' then 29 elseif a.mode=='file' then
29 h[f]=true 30 h[f]=true
30 end 31 end
31 end 32 end
32 return h 33 return h
33 end 34 end
34 35
35 function hfold(h, a, f, g) 36 function scan.hfold(h, a, f, g)
36 for n, c in pairs(h) do 37 for n, c in pairs(h) do
37 if type(c)=='table' then 38 if type(c)=='table' then
38 hfold(c, f(a, n), f, g) 39 scan.hfold(c, f(a, n), f, g)
39 else 40 else
40 g(a, n) 41 g(a, n)
41 end 42 end
42 end 43 end
43 end 44 end
44 45
45 function map(h, g, d) 46 function scan.map(h, g, d)
46 local function dir(prefix, name) 47 local function dir(prefix, name)
47 local p=path.join(prefix, name) 48 local p=path.join(prefix, name)
48 if d then 49 if d then
49 d(p) 50 d(p)
50 end 51 end
54 local function file(prefix, name) 55 local function file(prefix, name)
55 local f=path.join(prefix, name) 56 local f=path.join(prefix, name)
56 g(f) 57 g(f)
57 end 58 end
58 59
59 hfold(h, "", dir, file) 60 scan.hfold(h, "", dir, file)
60 end 61 end
62
63 return scan

mercurial