var [const] bases="ACGT", lbases=bases.toLower(); dna:=(190).pump(Data().howza(3),(0).random.fp(0,4),bases.get); // bucket of bytes foreach s,m in (T("Original","Mutated").zip(T(True,False))){ println("\n",s," DNA strand:"); dnaPP(dna); println("Base Counts: ", dna.len()," : ", dna.text.toUpper().counts() // ("A",5, "C",10, ...) .pump(String,Void.Read,"%s(%d) ".fmt)); if(m) mutate(dna,10,True); } fcn mutate(dna,count=1,verbose=False){ if(verbose) println("Mutating:"); do(count){ n,rb := (0).random(dna.len()), lbases[(0).random(4)]; switch( (0).random(3) ){ case(0){ if(verbose) println("Change[%d] '%s' to '%s'".fmt(n,dna.charAt(n),rb)); dna[n]=rb; } case(1){ if(verbose) println("Delete[%d] '%s'".fmt(n,dna.charAt(n))); dna.del(n); } else{ if(verbose) println("Insert[%d] '%s'".fmt(n,rb)); dna.insert(n,rb); } } } } fcn dnaPP(dna,N=50){ [0..*,50].zipWith(fcn(n,bases){ println("%6d: %s".fmt(n,bases.concat())) }, dna.walker().walk.fp(50)).pump(Void); // .pump forces the iterator }