summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt
blob: 85fe946a42739b09250cfaacbef887d7eb0c9d7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package io.dico.parcels2.blockvisitor

import io.dico.parcels2.util.Region
import io.dico.parcels2.util.Vec3i
import kotlin.coroutines.experimental.SequenceBuilder
import kotlin.coroutines.experimental.buildIterator

enum class RegionTraversal(private val builder: suspend SequenceBuilder<Vec3i>.(Region) -> Unit) {
    DOWNWARD({ region ->
        val origin = region.origin
        val size = region.size

        repeat(size.y) { y ->
            repeat(size.z) { z ->
                repeat(size.x) { x ->
                    yield(origin.add(x, size.y - y - 1, z))
                }
            }
        }

    }),

    UPWARD({ region ->
        val origin = region.origin
        val size = region.size

        repeat(size.y) { y ->
            repeat(size.z) { z ->
                repeat(size.x) { x ->
                    yield(origin.add(x, y, z))
                }
            }
        }
    }),

    ;

    fun regionTraverser(region: Region) = Iterable { buildIterator { builder(region) } }

}