diff options
| author | Ralph Amissah <ralph@amissah.com> | 2016-06-16 01:49:06 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2019-04-04 14:48:18 -0400 | 
| commit | 8ab7e935913c102fb039110e20b71f698a68c6ee (patch) | |
| tree | 3472debd16ce656a57150399ce666e248565f011 /src/sdlang/libinputvisitor | |
| parent | step4.1 as step4 but extract header meta & make on first reading in document (diff) | |
step5 sdlang used for config files and doc headers
Diffstat (limited to 'src/sdlang/libinputvisitor')
| -rw-r--r-- | src/sdlang/libinputvisitor/dub.json | 10 | ||||
| -rw-r--r-- | src/sdlang/libinputvisitor/libInputVisitor.d | 91 | 
2 files changed, 101 insertions, 0 deletions
| diff --git a/src/sdlang/libinputvisitor/dub.json b/src/sdlang/libinputvisitor/dub.json new file mode 100644 index 0000000..6e273c8 --- /dev/null +++ b/src/sdlang/libinputvisitor/dub.json @@ -0,0 +1,10 @@ +{ +	"name": "libinputvisitor", +	"description": "Write D input range generators in a straightforward coroutine style", +	"authors": ["Nick Sabalausky"], +	"homepage": "https://github.com/abscissa/libInputVisitor", +	"license": "WTFPL", +	"sourcePaths": ["."], +	"importPaths": ["."], +	"excludedSourceFiles": ["libInputVisitorExample.d"] +} diff --git a/src/sdlang/libinputvisitor/libInputVisitor.d b/src/sdlang/libinputvisitor/libInputVisitor.d new file mode 100644 index 0000000..15c2ce8 --- /dev/null +++ b/src/sdlang/libinputvisitor/libInputVisitor.d @@ -0,0 +1,91 @@ +/++ +Copyright (C) 2012 Nick Sabalausky <http://semitwist.com/contact> + +This program is free software. It comes without any warranty, to +the extent permitted by applicable law. You can redistribute it +and/or modify it under the terms of the Do What The Fuck You Want +To Public License, Version 2, as published by Sam Hocevar. See +http://www.wtfpl.net/ for more details. + +	DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE  +				Version 2, December 2004  + +Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>  + +Everyone is permitted to copy and distribute verbatim or modified  +copies of this license document, and changing it is allowed as long  +as the name is changed.  + +		DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE  +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION  + +0. You just DO WHAT THE FUCK YOU WANT TO. ++/ + +/++ +Should work with DMD 2.059 and up + +For more info on this, see: +http://semitwist.com/articles/article/view/combine-coroutines-and-input-ranges-for-dead-simple-d-iteration ++/ + +import core.thread; + +class InputVisitor(Obj, Elem) : Fiber +{ +	bool started = false; +	Obj obj; +	this(Obj obj) +	{ +		this.obj = obj; +		super(&run); +	} + +	private void run() +	{ +		obj.visit(this); +	} +	 +	private void ensureStarted() +	{ +		if(!started) +		{ +			call(); +			started = true; +		} +	} +	 +	// Member 'front' must be a function due to DMD Issue #5403 +	private Elem _front; +	@property Elem front() +	{ +		ensureStarted(); +		return _front; +	} +	 +	void popFront() +	{ +		ensureStarted(); +		call(); +	} +	 +	@property bool empty() +	{ +		ensureStarted(); +		return state == Fiber.State.TERM; +	} +	 +	void yield(Elem elem) +	{ +		_front = elem; +		Fiber.yield(); +	} +} + +template inputVisitor(Elem) +{ +	@property InputVisitor!(Obj, Elem) inputVisitor(Obj)(Obj obj) +	{ +		return new InputVisitor!(Obj, Elem)(obj); +	} +} | 
