var Gun = Gun || require('../gun');

Gun.chain.list = function(cb, opt){
	opt = opt || {};
	cb = cb || function(){}; 
	var gun = this.put({}); // insert assumes a graph node. So either create it or merge with the existing one.
	gun.last = function(obj, cb){
		var last = gun.path('last');
		if(!arguments.length){ return last }
		return gun.path('last').put(null).put(obj).val(function(val){ // warning! these are not transactional! They could be.
			console.log("last is", val);
			last.path('next').put(this._.node, cb);
		});
	}
	gun.first = function(obj, cb){
		var first = gun.path('first');
		if(!arguments.length){ return first }
		return gun.path('first').put(null).put(obj).val(function(){ // warning! these are not transactional! They could be.
			first.path('prev').put(this._.node, cb);
		});
	}
	return gun;
};

(function(){ // list tests
	return;
	var Gun = require('../index');
	var gun = Gun({file: 'data.json'});
	Gun.log.verbose = true;
	
	var list = gun.list();
	list.last({name: "Mark Nadal", type: "human", age: 23}).val(function(val){
		//console.log("oh yes?", val, '\n', this.__.graph);
	});
	list.last({name: "Amber Cazzell", type: "human", age: 23}).val(function(val){
		//console.log("oh yes?", val, '\n', this.__.graph);
	});
	list.list().last({name: "Hobbes", type: "kitten", age: 4}).val(function(val){
		//console.log("oh yes?", val, '\n', this.__.graph);
	});
	list.list().last({name: "Skid", type: "kitten", age: 2}).val(function(val){
		//console.log("oh yes?", val, '\n', this.__.graph);
	});
	setTimeout(function(){ list.val(function(val){
		console.log("the list!", list.__.graph);
		return;
		list.path('first').val(Gun.log)
			.path('next').val(Gun.log)
			.path('next').val(Gun.log);
	})}, 1000);

	return;
	gun.list().map(function(val, id){
		console.log("each!", id, val);
	})

}());