(function () {
	'use strict';

	var pg = require('pg');
	var aa = require('aa');

	aa.promisify(pg, 'connect', {suffix: 'A'});
	aa.promisify(pg.Client.prototype, 'connect', {suffix: 'A'});
	aa.promisify(pg.Client.prototype, 'query', {suffix: 'A'});

	// Client instance

	var host = process.env.PGHOST     || 'localhost';
	var port = process.env.PGPORT     || '5432';
	var db   = process.env.PGDATABASE || 'postgres';
	var user = process.env.PGUSER     || 'postgres';
	var pw   = process.env.PGPASSWORD || 'password';

	var conString = 'postgres://' + user + ':' + pw + '@' + host + '/' + db;

	aa(function *() {

		var client = new pg.Client(conString);

		try {
			var msg = 'could not connect to postgres';
			yield client.connectA();

			console.log('connected!!!');

			//client.queryA('SELECT $1::int AS numbor', ['1'])
			msg = 'error running query';
			var result = yield client.queryA('select * from s_tenant_r', []);

			//console.log(result.rows[0]);
			console.log(result);

			console.log('client.end()++');
			client.end();
			console.log('client.end()--');
		}
		catch (err) {
			return console.error(msg, err);
		}

		yield aa.wait(100);

		var client = new pg.Client(conString);

		console.log('2nd connectA++');
		yield client.connectA();
		console.log('2nd connectA--');
		var result = yield client.queryA('select * from s_tenant_r', []);
		console.log(result);
		client.end();
		yield aa.wait(100);
	});
})();
			setTimeout(cb, 0, new RangeError('sleep ms must be plus'));
	}


	// delay(ms, args,...)(cb) : thunk
	function delay(ms) {
		var args = [].slice.call(arguments);
		return function (cb) {
			sleep.apply(null, args.concat(cb));
		};
	}


	// aa(fn) | aa.wrap(fn) : returns wrapped function a.k.a thunkify and promisefy
	// wait(ms, args,...)   : returns promise & thunk
	var wait = aa.promisify(sleep);


	describe('basic', function () {

		it('sleep 10', function (done) {
			done = timed(done, 30);
			sleep(10, done);
		});

		it('sleep -1', function (done) {
			done = timed(done, 30);
			sleep(-1, expectError(done));
		});

		it('delay 10', function (done) {
void function () {
	'use strict';

	module.exports = searchFiles;

	const fs = require('fs');
	const path = require('path');

	const co = require('co');
	const aa = require('aa');
	const statAsync = aa.promisify(fs, fs.stat);
	const readdirAsync = aa.promisify(fs, fs.readdir);
	//const statAsync = aa.thunkify(fs, fs.stat);
	//const readdirAsync = aa.thunkify(fs, fs.readdir);

	// メイン
	if (require.main === module) {
		co(function *() {
			const dir = process.argv[2] || '.';
			const rex = process.argv[3] || '';

			try {
				const children = yield searchFiles(dir, rex);
				console.log(dir, inspect(children));
			} catch (err) { console.error(inspect(err)); }
		});
	}

	// searchFiles ファイルを検索
	function *searchFiles(dir, rex) {
		dir = path.resolve(dir);
		if (typeof rex === 'string')
			rex = new RegExp(rex, 'i');

		return yield search(dir);

		function *search(dir) {
			const stat = yield statAsync(dir);
			if (!stat.isDirectory())
				return null;

			const names = yield readdirAsync(dir);
			const children = {};
			for (let name of names) {
				const fullPath = path.resolve(dir, name);
				const child = yield search(fullPath);
				if (child || rex.test(name)) {
					children[name] = child;
					console.log(fullPath);
				}
			}
			return Object.keys(children).length ? children : null;
		} // search
	} // searchFiles

	// util.inspect
	function inspect(x) {
		return require('util').inspect(x, {depth:null, colors:true});
	}

}();