diff --git a/src/main/io/dkozak/search/engine/engine.kt b/src/main/io/dkozak/search/engine/engine.kt new file mode 100644 index 0000000..1b11a6d --- /dev/null +++ b/src/main/io/dkozak/search/engine/engine.kt @@ -0,0 +1,27 @@ +package io.dkozak.search.engine + +import io.dkozak.search.model.EngineConfiguration +import io.dkozak.search.model.Node + + +fun search(engineConfiguration: EngineConfiguration, logger: (String) -> Unit = {}) = engineConfiguration.executeSearch(logger) + +private fun EngineConfiguration.executeSearch(logger: (String) -> Unit): Node? { + val queue = searchQueue + queue.addNode(initialState) + while (!queue.isEmpty()) { + val nextNode = queue.next() + logger("Exploring state $nextNode") + if (isFinalState(nextNode)) { + logger("$nextNode is a final state, returning") + return nextNode + } + val children = expandNode(nextNode) + logger("Expanded node and got these children $children") + val filtered = children.filter(nodeFilter) + logger("Children after filtering $filtered") + queue.addNodes(filtered) + } + logger("Whole state space explored and no final node found, returning null") + return null +} diff --git a/src/main/io/dkozak/search/model/EngineConfiguration.kt b/src/main/io/dkozak/search/model/EngineConfiguration.kt new file mode 100644 index 0000000..6efa372 --- /dev/null +++ b/src/main/io/dkozak/search/model/EngineConfiguration.kt @@ -0,0 +1,10 @@ +package io.dkozak.search.model + +class EngineConfiguration +( + val initialState: Node, + val searchQueue: SearchQueue, + val expandNode: (Node) -> List, + val nodeFilter: (Node) -> Boolean, + val isFinalState: (Node) -> Boolean +) diff --git a/src/main/io/dkozak/search/model/Node.kt b/src/main/io/dkozak/search/model/Node.kt new file mode 100644 index 0000000..6eb2dc5 --- /dev/null +++ b/src/main/io/dkozak/search/model/Node.kt @@ -0,0 +1,4 @@ +package io.dkozak.search.model + +interface Node { +} \ No newline at end of file diff --git a/src/main/io/dkozak/search/model/SearchQueue.kt b/src/main/io/dkozak/search/model/SearchQueue.kt new file mode 100644 index 0000000..3b0d3ce --- /dev/null +++ b/src/main/io/dkozak/search/model/SearchQueue.kt @@ -0,0 +1,9 @@ +package io.dkozak.search.model + +interface SearchQueue { + fun next(): Node + fun addNodes(nodes: List) + fun isEmpty(): Boolean + + fun addNode(node: Node) = addNodes(listOf(node)) +} \ No newline at end of file