Mercurial Hosting > luan
annotate core/src/luan/modules/Io.luan @ 539:473e456444ff
Remove object-oriented primitive methods for string and binary
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 01 Jun 2015 17:53:55 -0600 |
parents | 92c3d22745b8 |
children | 18504c41b0be |
rev | line source |
---|---|
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
1 java() |
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
2 local IoLuan = require "java:luan.modules.IoLuan" |
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
3 local System = require "java:java.lang.System" |
297
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
4 |
503 | 5 local M = {} |
6 | |
7 M.read_console_line = IoLuan.read_console_line | |
8 M.schemes = IoLuan.newSchemes() | |
9 M.uri = IoLuan.uri | |
10 M.stdin = IoLuan.defaultStdin.table() | |
11 M.socket_server = IoLuan.socket_server | |
12 M.stdout = IoLuan.textWriter(System.out) | |
13 M.stderr = IoLuan.textWriter(System.err) | |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
14 |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
15 |
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
16 local Luan = require "luan:Luan" |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
17 local to_string = Luan.to_string |
422 | 18 local type = Luan.type |
19 local try = Luan.try | |
20 local ipairs = Luan.ipairs | |
21 local pairs = Luan.pairs | |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
22 local values = Luan.values |
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
23 local Table = require "luan:Table" |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
24 local unpack = Table.unpack |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
25 local String = require "luan:String" |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
26 local encode = String.encode |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
27 local matches = String.matches |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
28 |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
29 |
503 | 30 function M.print_to(out,...) |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
31 local list = {} |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
32 for v in values(...) do |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
33 list[#list+1] = to_string(v) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
34 list[#list+1] = '\t' |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
35 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
36 if #list == 0 then |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
37 out.write( '\n' ) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
38 else |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
39 list[#list] = '\n' |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
40 out.write( unpack(list) ) |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
41 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
42 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
43 |
503 | 44 function M.print(...) |
45 M.print_to(M.stdout,...) | |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
46 end |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
47 |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
48 |
422 | 49 -- repr |
50 | |
51 local function do_repr(obj,done) | |
52 local tp = type(obj) | |
53 if tp == "table" then | |
54 if done[obj] == true then | |
55 %><circular reference><% | |
56 return | |
57 end | |
58 done[obj] = true | |
59 %>{<% | |
60 local is_first = true | |
61 local in_list = {} | |
62 for key, value in ipairs(obj) do | |
63 if is_first then is_first = false else %>, <% end | |
64 do_repr(value,done) | |
65 in_list[key] = true | |
66 end | |
67 for key, value in pairs(obj) do | |
68 if in_list[key] ~= true then | |
69 if is_first then is_first = false else %>, <% end | |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
70 if type(key) == "string" and matches(key,"[a-zA-Z_][a-zA-Z_0-9]*") ~= nil then |
422 | 71 %><%=key%><% |
424 | 72 elseif type(key) == "table" then |
73 %>[<<%=key%>>]<% | |
422 | 74 else |
75 %>[<%do_repr(key,done)%>]<% | |
76 end | |
77 %>=<% do_repr(value,done) | |
78 end | |
79 end | |
80 %>}<% | |
81 elseif tp == "string" then | |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
82 %>"<%=encode(obj)%>"<% |
422 | 83 elseif tp == "nil" or tp == "boolean" or tp == "number" then |
84 %><%=obj%><% | |
85 else | |
86 %><<%=obj%>><% | |
87 end | |
88 end | |
89 | |
503 | 90 local uri = M.uri -- make local |
435
5b36f663a1b8
make members lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
424
diff
changeset
|
91 |
503 | 92 function M.repr(obj) |
93 local old_out = M.stdout | |
422 | 94 return try { |
95 function() | |
435
5b36f663a1b8
make members lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
424
diff
changeset
|
96 local string_uri = uri "string:" |
503 | 97 M.stdout = string_uri.text_writer() |
422 | 98 do_repr(obj,{}) |
503 | 99 M.stdout.close() |
422 | 100 return string_uri.read_text() |
101 end; | |
102 finally = function() | |
503 | 103 M.stdout = old_out |
422 | 104 end; |
105 } | |
106 end | |
107 | |
108 | |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
109 -- useful for SimplyHTML responsiveness |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
110 |
503 | 111 local NO = {} |
112 M.NO = NO | |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
113 |
503 | 114 function M.dont_write_when_no(write_fn) |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
115 return function(...) |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
503
diff
changeset
|
116 for v in values(...) do |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
117 if v == NO then |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
118 return |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
119 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
120 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
121 write_fn(...) |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
122 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
123 end |
503 | 124 |
125 return M |