1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-02-23 14:40:34 +01:00

shachain: addHash is just a bit less ugly

This commit is contained in:
sstone 2015-09-01 00:00:53 +02:00
parent 704f02daad
commit d832db205b
2 changed files with 9 additions and 5 deletions

View file

@ -28,13 +28,16 @@ object ShaChain {
def addHash(chain: ShaChain, hash: BinaryData, index: Long) : ShaChain = { def addHash(chain: ShaChain, hash: BinaryData, index: Long) : ShaChain = {
require(index == chain.maxIndex + 1 || (index == 0 && chain.knownHashes.isEmpty)) require(index == chain.maxIndex + 1 || (index == 0 && chain.knownHashes.isEmpty))
chain.knownHashes.zipWithIndex.find {case (k, i) => canDerive(index, k.index) } match {
case Some((KnownHash(h, i), pos)) => def updateKnownHashes(knowHashes: Seq[KnownHash], acc: Seq[KnownHash] = Seq.empty[KnownHash]) : Seq[KnownHash] = knowHashes match {
case Nil => acc :+ KnownHash(hash, index)
case KnownHash(h, i) :: tail if canDerive(index, i) =>
val expected: BinaryData = derive(hash, index, i) val expected: BinaryData = derive(hash, index, i)
require(h == expected) require(h == expected)
chain.copy(maxIndex = index, knownHashes = chain.knownHashes.updated(pos, KnownHash(hash, index)).take(pos + 1)) acc :+ KnownHash(hash, index)
case None => chain.copy(maxIndex = index, knownHashes = chain.knownHashes :+ KnownHash(hash, index)) case head :: tail => updateKnownHashes(tail, acc :+ head)
} }
chain.copy(maxIndex = index, knownHashes = updateKnownHashes(chain.knownHashes))
} }
def getHash(chain: ShaChain, index: Long) : Option[BinaryData] = { def getHash(chain: ShaChain, index: Long) : Option[BinaryData] = {

View file

@ -71,7 +71,8 @@ class ShaChainSpec extends FunSuite {
chain = ShaChain.addHash(chain, expect(i), i) chain = ShaChain.addHash(chain, expect(i), i)
for(j <- 0 to i) { for(j <- 0 to i) {
val hash = ShaChain.getHash(chain, j) val hash = ShaChain.getHash(chain, j)
assert(hash == Some(expect(j))) val expected = expect(j)
assert(hash == Some(expected))
} }
assert(ShaChain.getHash(chain, i + 1) == None) assert(ShaChain.getHash(chain, i + 1) == None)
} }