package Ġic . org . util Ċ Ċ import Ġic . org . arm . AR MA sm Instr Ċ import Ġic . org . arm . Data Ċ import Ġic . org . arm . Exception Ċ import Ġic . org . arm . Std Func Ċ import Ġic . org . arm . String Data Ċ import Ġjava . util . LinkedList Ċ import Ġkotlinx . collections . immutable . Persistent List Ċ import Ġkotlinx . collections . immutable . Persistent Set Ċ import Ġkotlinx . collections . immutable . persistent ListOf Ċ import Ġkotlinx . collections . immutable . persistent Set Of Ċ import Ġkotlinx . collections . immutable . plus Ċ import Ġkotlinx . collections . immutable . to Persistent List Ċ Ċ type alias ĠInstructions Ġ= ĠPersistent List < AR MA sm Instr > Ċ type alias ĠDat as Ġ= ĠPersistent List < Data > Ċ Ċ /** Ċ Ġ* ĠReturned Ġby Ġsomething Ġthat Ġproduces Ġassembly . Ġ[ instr ] Ġcorresponds Ġto Ġthe Ġassembly Ġinstructions , Ċ Ġ* Ġand Ġ[ data ] Ġto Ġinformation Ġin Ġthe ĠData Ġsegment . Ċ Ġ*/ Ċ class ĠAR MA sm Ċ private Ġconstructor ( ĊĠ Ġval Ġinstr : ĠInstructions Ġ= Ġpersistent ListOf (), ĊĠ Ġval Ġdata : ĠDat as Ġ= Ġpersistent ListOf (), ĊĠ Ġval Ġfuncs : ĠPersistent Set < AR MA sm > Ġ= Ġpersistent Set Of () Ċ ) Ġ{ ĊĠ Ġval ĠisEmpty Ġby Ġlazy Ġ{ Ġinstr . isEmpty () Ġ&& Ġdata . isEmpty () Ġ&& Ġfuncs . isEmpty () Ġ} ĊĊĠ Ġconstructor ( instr : ĠInstructions Ġ= Ġpersistent ListOf (), Ġdata : ĠDat as Ġ= Ġpersistent ListOf ()) Ġ: ĊĠĠĠĠĠ Ġthis ( instr , Ġdata , Ġpersistent Set Of ()) ĊĊĠ Ġfun Ġcombine ( other : ĠAR MA sm ) Ġ= ĠAR MA sm ( instr Ġ+ Ġother . instr , Ġdata Ġ+ Ġother . data , Ġfuncs . addAll ( other . funcs )) ĊĊĠ Ġoperator Ġfun Ġplus ( other : ĠAR MA sm ) Ġ= Ġcombine ( other ) ĊĠ Ġoperator Ġfun Ġplus ( other : ĠInstructions ) Ġ= Ġcombine ( AR MA sm ( other )) ĊĠ Ġoperator Ġfun Ġplus ( other : ĠAR MA sm Instr ) Ġ= Ġcombine ( instr ( other )) ĊĊĠ Ġfun Ġwith Function ( other : ĠAR MA sm ) Ġ= ĊĠĠĠ ĠAR MA sm ( instr , Ġdata , Ġfuncs Ġ+ Ġother ). with Functions ( other . funcs ) ĊĊĠ Ġfun Ġwith Functions ( others : ĠCollection < AR MA sm >) Ġ= ĊĠĠĠ ĠAR MA sm ( instr , Ġdata , Ġfuncs Ġ+ Ġothers Ġ+ Ġothers . map Ġ{ Ġit . funcs Ġ}. flatten ()) ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĠĠĠ Ġother Ġas ĠAR MA sm ĊĠĠĠ Ġif Ġ( instr Ġ!= Ġother . instr ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( data Ġ!= Ġother . data ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( funcs Ġ!= Ġother . funcs ) Ġreturn Ġfalse ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġinstr . hashCode () ĊĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġdata . hashCode () ĊĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġfuncs . hashCode () ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġoperator Ġfun Ġcomponent 1 () Ġ= Ġinstr ĊĠ Ġoperator Ġfun Ġcomponent 2 () Ġ= Ġdata ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= ĊĠĠĠ Ġ" Code ( instr =\ n ${ instr . map Ġ{ Ġit . code Ġ}. join Lines ()}, Ġdata =\ n $ data , Ġfuncs =\ n $ funcs )" ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġfun Ġwrite ( init : ĠBuilder Scope . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠ ĠBuilder Scope (). apply ( init ). codes . flatten () ĊĊĠĠĠ Ġval Ġempty Ġ= ĠAR MA sm ( ĊĠĠĠĠĠ Ġpersistent ListOf < Nothing >(), ĊĠĠĠĠĠ Ġpersistent ListOf < Nothing >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġinstr ( instr : ĠAR MA sm Instr ) Ġ= ĠAR MA sm ( ĊĠĠĠĠĠ Ġpersistent ListOf ( instr ), ĊĠĠĠĠĠ Ġpersistent ListOf < Nothing >() ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġclass ĠBuilder Scope Ġ{ ĊĠĠĠ Ġinternal Ġval Ġcodes Ġ= ĠLinkedList < AR MA sm >() ĊĠĠĠ Ġoperator Ġfun ĠAR MA sm . unary Plus () Ġ= Ġcodes . add Last ( this ) ĊĠĠĠ Ġoperator Ġfun ĠAR MA sm Instr . unary Plus () Ġ= Ġcodes . add Last ( AR MA sm ( instr Ġ= Ġpersistent ListOf ( this ))) ĊĠĠĠ Ġoperator Ġfun ĠList < AR MA sm Instr >. unary Plus () Ġ= Ġcodes . add Last ( AR MA sm ( instr Ġ= Ġto Persistent List ())) ĊĠĠĠ Ġfun Ġwith Function ( other : ĠAR MA sm ) Ġ= Ġcodes . add Last ( empty . with Function ( other )) ĊĠĠĠ Ġfun Ġwith Function ( exception : ĠException ) Ġ= Ġwith Function ( exception . body ) ĊĠĠĠ Ġfun Ġwith Function ( func : ĠStd Func ) Ġ= Ġwith Function ( func . body ) ĊĠĠĠ Ġfun Ġwith Functions ( others : ĠCollection < AR MA sm >) Ġ= Ġcodes . add Last ( empty . with Functions ( others )) ĊĠĠĠ Ġfun Ġdata ( init : ĠBuilder Data Scope . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġval Ġd Ġ= ĠBuilder Data Scope (). apply ( init ) ĊĠĠĠĠĠ Ġcodes . add Last ( AR MA sm ( data Ġ= Ġd . instr s . to Persistent List ())) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġclass ĠBuilder Data Scope Ġ{ ĊĠĠĠ Ġinternal Ġval Ġinstr s Ġ= ĠLinkedList < Data >() ĊĠĠĠ Ġoperator Ġfun ĠData . unary Plus () Ġ= Ġinstr s . add Last ( this ) ĊĠĠĠ Ġoperator Ġfun ĠString Data . unary Plus () Ġ= Ġbody . forEach Ġ{ Ġinstr s . add Last ( it ) Ġ} ĊĠĠĠ Ġoperator Ġfun ĠList < Data >. unary Plus () Ġ= ĠforEach Ġ{ Ġinstr s . add Last ( it ) Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun ĠInstructions . code () Ġ= ĠAR MA sm ( this ) Ċ fun ĠList < AR MA sm >. flatten () Ġ= Ġfold ( AR MA sm . empty , ĠAR MA sm :: combine ) Ċ