add light docs describing the befunge interface
This commit is contained in:
@@ -12,21 +12,36 @@ interface Funge {
|
|||||||
operator fun get(vec: Vec): Value
|
operator fun get(vec: Vec): Value
|
||||||
operator fun set(vec: Vec, value: Value)
|
operator fun set(vec: Vec, value: Value)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the next position to be executed starting at [vec] and stepping by [delta]
|
||||||
|
*/
|
||||||
fun nextVec(vec: Vec, delta: Vec): Vec
|
fun nextVec(vec: Vec, delta: Vec): Vec
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the contents of the funge based on a string, handling newlines appropriately
|
||||||
|
*/
|
||||||
fun setString(data: String)
|
fun setString(data: String)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return An iterable of executable positions, starting at [vec] and stepping by [delta]
|
||||||
|
*/
|
||||||
fun nextVecs(vec: Vec, delta: Vec): Iterable<Vec> {
|
fun nextVecs(vec: Vec, delta: Vec): Iterable<Vec> {
|
||||||
return generateSequence(vec) {
|
return generateSequence(vec) {
|
||||||
nextVec(it, delta)
|
nextVec(it, delta)
|
||||||
}.asIterable()
|
}.asIterable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starting at [vec] and stepping by [delta], fill those positions with values in [data]
|
||||||
|
*/
|
||||||
fun setMany(vec: Vec, delta: Vec, data: List<Value>) {
|
fun setMany(vec: Vec, delta: Vec, data: List<Value>) {
|
||||||
for ((e, v) in data.zip(nextVecs(vec, delta)))
|
for ((e, v) in data.zip(nextVecs(vec, delta)))
|
||||||
set(v, e)
|
set(v, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return An iterable of those values at the executable positions starting at [vec] and stepping by [delta].
|
||||||
|
*/
|
||||||
fun getMany(vec: Vec, delta: Vec, count: Int): Iterable<Value> {
|
fun getMany(vec: Vec, delta: Vec, count: Int): Iterable<Value> {
|
||||||
return nextVecs(vec, delta).take(count).map(this::get).asIterable()
|
return nextVecs(vec, delta).take(count).map(this::get).asIterable()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,13 @@ import befide.befunge.events.StackEvent
|
|||||||
import befide.befunge.state.Value
|
import befide.befunge.state.Value
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for a Befunge interpreter
|
||||||
|
*
|
||||||
|
* @property fungeChanged Invoked whenever the [funge] is modified
|
||||||
|
* @property stackChanged Invoked whenever the [stack] is modified
|
||||||
|
* @property ipChanged Invoked whenever the [ip] is modified
|
||||||
|
*/
|
||||||
interface Interpreter {
|
interface Interpreter {
|
||||||
val funge: Funge
|
val funge: Funge
|
||||||
val stack: Stack<Value>
|
val stack: Stack<Value>
|
||||||
@@ -16,7 +23,14 @@ interface Interpreter {
|
|||||||
val stackChanged: Event<StackEvent>
|
val stackChanged: Event<StackEvent>
|
||||||
val ipChanged: Event<IpEvent>
|
val ipChanged: Event<IpEvent>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return If [ip] is inactive after this step, indicating execution has halted, then return `false`
|
||||||
|
*/
|
||||||
fun step(): Boolean
|
fun step(): Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the state of the interpreter to the last state before [step] was executed - that is, reset [funge] and [ip] to the state which was manually set, before any interpretation via [step]
|
||||||
|
*/
|
||||||
fun reset()
|
fun reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ import befide.befunge.events.IpEvent
|
|||||||
import befide.befunge.state.IpMode
|
import befide.befunge.state.IpMode
|
||||||
import befide.befunge.state.Vec
|
import befide.befunge.state.Vec
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a Befunge Instruction Pointer
|
||||||
|
*
|
||||||
|
* Note that [Vec] need not be a concrete type, but is simply to be easier to implement 2d Befunge
|
||||||
|
*/
|
||||||
interface Pointer {
|
interface Pointer {
|
||||||
val pos: Vec
|
val pos: Vec
|
||||||
val delta: Vec
|
val delta: Vec
|
||||||
|
|||||||
@@ -1,15 +1,38 @@
|
|||||||
package befide.befunge.events
|
package befide.befunge.events
|
||||||
|
|
||||||
/**
|
|
||||||
* Source is pulled unmodified from https://github.com/notiocide/kotlin-events, under the MIT licence
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
|
||||||
typealias Handler<EventType> = Consumer<EventType>
|
typealias Handler<EventType> = Consumer<EventType>
|
||||||
|
|
||||||
internal operator fun <T> Handler<T>.invoke(t: T) = accept(t)
|
internal operator fun <T> Handler<T>.invoke(t: T) = accept(t)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Source is pulled unmodified from https://github.com/notiocide/kotlin-events, under the MIT licence
|
||||||
|
*
|
||||||
|
* Sample usage:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* data class ServerEvent(val joined: Boolean, val user: String)
|
||||||
|
|
||||||
|
* fun main(args: Array<String>) {
|
||||||
|
* val event = Event<ServerEvent>()
|
||||||
|
* var userCount = 0
|
||||||
|
*
|
||||||
|
* event += { (joined, user) -> println("$user ${if (joined) "joined" else "left"}") }
|
||||||
|
* event += { userCount += if (it.joined) 1 else -1 }
|
||||||
|
*
|
||||||
|
* event(ServerEvent(true, "Alice"))
|
||||||
|
* event(ServerEvent(true, "Bob"))
|
||||||
|
* event(ServerEvent(true, "Charles"))
|
||||||
|
*
|
||||||
|
* println("Users: $userCount")
|
||||||
|
*
|
||||||
|
* event(ServerEvent(false, "Bob"))
|
||||||
|
*
|
||||||
|
* println("Users: $userCount")
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
class Event<T> : Iterable<MutableMap.MutableEntry<String, Handler<T>>> {
|
class Event<T> : Iterable<MutableMap.MutableEntry<String, Handler<T>>> {
|
||||||
|
|
||||||
private val list = LinkedHashMap<String, Handler<T>>()
|
private val list = LinkedHashMap<String, Handler<T>>()
|
||||||
|
|||||||
@@ -3,4 +3,6 @@ package befide.befunge.events
|
|||||||
import befide.befunge.state.Value
|
import befide.befunge.state.Value
|
||||||
import befide.befunge.state.Vec
|
import befide.befunge.state.Vec
|
||||||
|
|
||||||
data class FungeEvent(val vec: Vec, val from: Value, val to: Value)
|
data class FungeChange(val vec: Vec, val from: Value, val to: Value)
|
||||||
|
|
||||||
|
data class FungeEvent(val changes: List<FungeChange>)
|
||||||
@@ -7,6 +7,7 @@ import javafx.scene.Parent
|
|||||||
import javafx.scene.control.Label
|
import javafx.scene.control.Label
|
||||||
import tornadofx.*
|
import tornadofx.*
|
||||||
|
|
||||||
|
|
||||||
class SampleView : View() {
|
class SampleView : View() {
|
||||||
private val controller: SampleController by inject()
|
private val controller: SampleController by inject()
|
||||||
|
|
||||||
@@ -43,4 +44,8 @@ class SampleController : Controller() {
|
|||||||
|
|
||||||
class SampleApp : App() {
|
class SampleApp : App() {
|
||||||
override val primaryView = SampleView::class
|
override val primaryView = SampleView::class
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
launch<SampleApp>(args)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user