package Ġme . pal azz om ichi . brain f uck interpreter Ċ Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ Ċ /** Ċ Ġ* ĠAn Ġinterpreter Ġfor Ġthe ĠBr ain f uck Ġprogramming Ġlanguage . Ċ Ġ* Ċ Ġ* Ġ@ property Ġconfiguration Ġthe Ġconfiguration Ġof Ġthe Ġinterpreter Ċ Ġ* Ġ@ see ĠBr ain f uck Program Ċ Ġ* Ġ@ author ĠM ichi ĠPal azz o Ċ Ġ*/ Ċ class ĠBr ain f uck Interpreter ( private Ġval Ġconfiguration : ĠConfiguration ) Ġ{ ĊĠĠĠĠĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param ĠinputStream Ġ Ġinput Ġstream Ġof Ġthe Ġprogram ĊĠĠĠĠ Ġ* Ġ@ param ĠoutputStream Ġthe Ġoutput Ġstream Ġof Ġthe Ġprogram ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( inputStream : ĠInputStream , ĠoutputStream : ĠOutputStream ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( Configuration ( inputStream , ĠoutputStream )) ĊĠĠĠĠĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġa Ġ[ Brain f uck Program ] Ġtaking Ġan Ġ[ input ][ Configuration . inputStream ] Ġand Ġstoring Ġthe ĊĠĠĠĠ Ġ* Ġresult Ġin Ġthe Ġ[ output ][ Configuration . output Stream ] Ġusing Ġthe Ġ[ cells ] Ġargument Ġas Ġthe Ġprogram ĊĠĠĠĠ Ġ* Ġcells . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġmethod Ġdoes Ġ** not ** Ġfl ushes Ġthe Ġ[ output ][ Configuration . output Stream ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprogram ĠĠĠĠĠĠ Ġthe Ġprogram Ġto Ġexecute ĊĠĠĠĠ Ġ* Ġ@ param Ġcells ĠĠĠĠĠĠĠĠ Ġthe Ġcell Ġiterator Ġused Ġby Ġthe Ġprogram ĊĠĠĠĠ Ġ* Ġ@ throws ĠBr ain f uck Exception Ġif Ġa Ġexception Ġoccurs Ġduring Ġde Ġprogram Ġexecution , ĊĠĠĠĠ Ġ* Ġfor Ġexample Ġif Ġyou Ġtry Ġto Ġgo Ġbelow Ġthe Ġfirst Ġcell ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexecute ( program : ĠBr ain f uck Program , Ġcells : ĠCell Iterator Ġ= ĠCell Iterator . default ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram . instructions . forEach Ġ{ Ġit . execute ( cells , Ġconfiguration ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ property ĠinputStream Ġ Ġinput Ġstream Ġof Ġthe Ġprogram ĊĠĠĠĠ Ġ* Ġ@ property ĠoutputStream Ġthe Ġoutput Ġstream Ġof Ġthe Ġprogram ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠConfiguration ( val ĠinputStream : ĠInputStream , Ġval ĠoutputStream : ĠOutputStream ) Ċ } Ċ