I am searching for an efficient a technique to find a sequence of Op
occurences in a Seq[Op]
. Once an occurence is found, I want to replace the occurence with a defined replacement and run the same search again until the list stops changing.
Scenario:
I have three types of Op
case classes. Pop()
extends Op
, Push()
extends Op
and Nop()
extends Op
. I want to replace the occurence of Push(), Pop()
with Nop()
. Basically the code could look like seq.replace(Push() ~ Pop() ~> Nop())
.
Problem:
Now that I call seq.replace(...)
I will have to search in the sequence for an occurence of Push(), Pop()
. So far so good. I find the occurence. But now I will have to splice the occurence form the list and insert the replacement.
Now there are two options. My list could be mutable or immutable. If I use an immutable list I am scared regarding performance because those sequences are usually 500+ elements in size. If I replace a lot of occurences like A ~ B ~ C ~> D ~ E
I will create a lot of new objects If I am not mistaken. However I could also use a mutable sequence like ListBuffer[Op]
.
Basically from a linked-list background I would just do some pointer-bending and after a total of four operations I am done with the replacement without creating new objects. That is why I am now concerned about performance. Especially since this is a performance-critical operation for me.
Question:
How would you implement the replace()
method in a Scala fashion and what kind of data structure would you use keeping in mind that this is a performance-critical operation?
I am happy with answers that point me in the right direction or pseudo code. No need to write a full replace method.
Thank you.