summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt
blob: 19eb7ee7d3b81c8eb413d39f3d521d70fe21a0fa (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))
                }
            }
        }

    }),

    UPDARD({ 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) } }

}