Browse Source
Added mutable history container
Added mutable history container
TODO make an imutable observable based history container based on this onemaster
Rohan Sircar
3 years ago
2 changed files with 147 additions and 0 deletions
@ -0,0 +1,31 @@ |
|||
package nova.monadic_sfx.util |
|||
|
|||
class MutHistory[T](initValue: T) { |
|||
private var _values = Vector(initValue) |
|||
def values = _values |
|||
private var _sp = 0 |
|||
def sp = _sp |
|||
|
|||
// def current = if (ints.isEmpty) None else Some(ints(sp)) |
|||
def current = _values(_sp) |
|||
|
|||
def push(v: T) = { |
|||
if (_sp < _values.length - 1) { |
|||
_values = _values.splitAt(_sp)._1 |
|||
_values = _values :+ v |
|||
} else { |
|||
_values = _values :+ v |
|||
_sp = _values.length - 1 |
|||
} |
|||
} |
|||
|
|||
def forward() = { |
|||
if (!_values.isEmpty && _sp < _values.length - 1) _sp += 1 |
|||
} |
|||
|
|||
def backward() = { |
|||
if (_sp > 0) { |
|||
_sp -= 1 |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,116 @@ |
|||
import org.scalatest.funsuite.AnyFunSuite |
|||
import nova.monadic_sfx.util.MutHistory |
|||
import com.typesafe.scalalogging.LazyLogging |
|||
class MutHistoryTest extends AnyFunSuite with LazyLogging { |
|||
val h = new MutHistory(0) |
|||
|
|||
test("init") { |
|||
assert(h.values == Vector(0)) |
|||
assert(h.sp == 0) |
|||
assert(h.current == 0) |
|||
} |
|||
test("push 1") { |
|||
h.push(1) |
|||
// logger.debug(mutHistory.ints.toString) |
|||
assert(h.values == Vector(0, 1)) |
|||
assert(h.values.length - 1 == h.sp) |
|||
assert(h.current == 1) |
|||
} |
|||
test("push 2") { |
|||
h.push(2) |
|||
// logger.debug(mutHistory.ints.toString) |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.values.length - 1 == h.sp) |
|||
assert(h.current == 2) |
|||
} |
|||
test("first forward") { |
|||
// logger.debug(mutHistory.ints.toString) |
|||
// logger.debug(mutHistory.sp.toString) |
|||
h.forward() |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.sp == 2) |
|||
assert(h.current == 2) |
|||
} |
|||
test("second forward") { |
|||
// logger.debug(mutHistory.ints.toString) |
|||
// logger.debug(mutHistory.sp.toString) |
|||
h.forward() |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.sp == 2) |
|||
assert(h.current == 2) |
|||
} |
|||
|
|||
test("first backward") { |
|||
h.backward() |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.sp == 1) |
|||
assert(h.current == 1) |
|||
} |
|||
test("second backward") { |
|||
h.backward() |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.sp == 0) |
|||
assert(h.current == 0) |
|||
} |
|||
test("third backward") { |
|||
h.backward() |
|||
assert(h.values == Vector(0, 1, 2)) |
|||
assert(h.sp == 0) |
|||
assert(h.current == 0) |
|||
} |
|||
test("push 3") { |
|||
h.push(3) |
|||
assert(h.sp == 0) |
|||
assert(h.values == Vector(3)) |
|||
assert(h.current == 3) |
|||
} |
|||
test("fourth backward") { |
|||
h.backward() |
|||
assert(h.values == Vector(3)) |
|||
assert(h.sp == 0) |
|||
assert(h.current == 3) |
|||
} |
|||
test("lastly") { |
|||
h.push(4) |
|||
h.push(5) |
|||
h.push(6) |
|||
h.push(7) |
|||
h.push(8) |
|||
assert(h.values == Vector(3, 4, 5, 6, 7, 8)) |
|||
assert(h.sp == 5) |
|||
assert(h.current == 8) |
|||
h.backward() |
|||
h.backward() |
|||
assert(h.current == 6) |
|||
assert(h.sp == 3) |
|||
h.push(9) |
|||
assert(h.values == Vector(3, 4, 5, 9)) |
|||
assert(h.sp == 3) |
|||
assert(h.current == 9) |
|||
for (i <- 1 to 4) h.backward() |
|||
// assert(h.current == None) |
|||
// assert(h.ints == Vector.empty) |
|||
assert(h.sp == 0) |
|||
assert(h.current == 3) |
|||
h.push(1) |
|||
assert(h.current == 1) |
|||
assert(h.sp == 0) |
|||
|
|||
} |
|||
} |
|||
|
|||
// test("main") { |
|||
// assert(mutHistory.ints == Vector.empty) |
|||
// assert(mutHistory.sp == -1) |
|||
// mutHistory.push(1) |
|||
// assert(mutHistory.ints == Vector(1)) |
|||
// assert(mutHistory.sp == 0) |
|||
// mutHistory.push(2) |
|||
// assert(mutHistory.ints == Vector(1, 2)) |
|||
// assert(mutHistory.sp == 1) |
|||
// // mutHistory.forward() |
|||
// // assert(mutHistory.sp == 1) |
|||
// // mutHistory.forward() |
|||
// // assert(mutHistory.sp == 1) |
|||
// } |
|||
// |
Write
Preview
Loading…
Cancel
Save
Reference in new issue