summaryrefslogtreecommitdiffstats
path: root/test/multiplexing.lua
blob: 8265e4c24f6f89f07404cfee594dc6611909896d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!bin/lem
--
-- This file is part of LEM, a Lua Event Machine.
-- Copyright 2011-2012 Emil Renner Berthing
--
-- LEM is free software: you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation, either version 3 of
-- the License, or (at your option) any later version.
--
-- LEM is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with LEM.  If not, see <http://www.gnu.org/licenses/>.
--

local utils   = require 'lem.utils'
local streams = require 'lem.streams'
local queue   = require 'lem.streams.queue'

local exit   = false
local ticker = utils.sleeper()
local stdout = queue.wrap(streams.stdout)

do
	local format = string.format
	function queue.QOStream:printf(...)
		return self:write(format(...))
	end
end

-- this function just reads lines from a
-- stream and prints them to stdout
local function poll(stream, name)
	repeat
		local line, err = stream:read('*l')
		if not line then
			stdout:printf('%s: %s\n', name, err)
			break
		end

		stdout:printf('%s: %s\n', name, line)
	until line == 'quit'

	exit = true
	ticker:wakeup()
end

-- type 'mkfifo pipe' to create a named pipe for this script
-- and do 'cat > pipe' (in another terminal) to write to it
local pipe = assert(streams.open(arg[1] or 'pipe', 'r'))

-- spawn coroutines to read from stdin and the pipe
utils.spawn(poll, streams.stdin, 'stdin')
utils.spawn(poll, pipe, 'pipe')

do
	--local out = streams.stderr
	local out = stdout
	local sound

	repeat
		if sound == 'tick\n' then
			sound = 'tock\n'
		else
			sound = 'tick\n'
		end
		out:write(sound)
		ticker:sleep(1.0)
	until exit
end

streams.stdin:close()
pipe:close()

-- vim: syntax=lua ts=2 sw=2 noet: