package Ġpretty Ċ Ċ public Ġsealed Ġclass ĠSimple Doc F < out ĠA > Ġ{ ĊĠĠĠ Ġpublic Ġobject ĠFail Ġ: ĠSimple Doc F < Nothing >() ĊĠĠĠ Ġpublic Ġobject ĠNil Ġ: ĠSimple Doc F < Nothing >() ĊĠĠĠ Ġpublic Ġdata Ġclass ĠLine < A >( val Ġi : ĠInt , Ġval Ġdoc : ĠSimple Doc < A >) Ġ: ĠSimple Doc F < A >() ĊĠĠĠ Ġpublic Ġdata Ġclass ĠText < A >( val Ġstr : ĠString , Ġval Ġdoc : ĠSimple Doc < A >) Ġ: ĠSimple Doc F < A >() ĊĠĠĠ Ġpublic Ġdata Ġclass ĠAdd Annotation < A >( val Ġann : ĠA , Ġval Ġdoc : ĠSimple Doc < A >) Ġ: ĠSimple Doc F < A >() ĊĠĠĠ Ġpublic Ġdata Ġclass ĠRemove Annotation < A >( val Ġdoc : ĠSimple Doc < A >) Ġ: ĠSimple Doc F < A >() Ċ } Ċ Ċ public Ġdata Ġclass ĠSimple Doc < out ĠA >( val Ġun Doc : ĠEval < Simple Doc F < A >>) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Simple Doc ( un Doc =${ un Doc () })" ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġfail (): ĠSimple Doc < Nothing > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Fail )) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġnil (): ĠSimple Doc < Nothing > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Nil )) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< A > Ġtext ( str : ĠString , Ġnext : ĠSimple Doc < A >): ĠSimple Doc < A > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Text ( str , Ġnext ))) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< A > Ġline ( i : ĠInt , Ġnext : ĠSimple Doc < A >): ĠSimple Doc < A > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Line ( i , Ġnext ))) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< A > Ġadd Annotation ( ann : ĠA , Ġnext : ĠSimple Doc < A >): ĠSimple Doc < A > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Add Annotation ( ann , Ġnext ))) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< A > Ġremove Annotation ( next : ĠSimple Doc < A >): ĠSimple Doc < A > Ġ= ĠSimple Doc ( Eval . now ( Simple Doc F . Remove Annotation ( next ))) ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġoperator Ġfun Ġ< A > ĠSimple Doc < A >. plus ( b : ĠSimple Doc < A >): ĠSimple Doc < A > Ġ= ĠSimple Doc ( un Doc . flatMap Ġ{ ĊĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Nil Ġ-> Ġb . un Doc ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Fail Ġ-> ĠEval . now ( Simple Doc F . Fail ) ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Text Ġ-> ĠEval . now ( it . copy ( doc Ġ= Ġit . doc Ġ+ Ġb )) ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Line Ġ-> ĠEval . now ( it . copy ( doc Ġ= Ġit . doc Ġ+ Ġb )) ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Add Annotation Ġ-> ĠEval . now ( it . copy ( doc Ġ= Ġit . doc Ġ+ Ġb )) ĊĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Remove Annotation Ġ-> ĠEval . now ( it . copy ( doc Ġ= Ġit . doc Ġ+ Ġb )) ĊĠĠĠ Ġ} Ċ }) Ċ Ċ public Ġfun Ġ< A > ĠSimple Doc < A >. render String (): ĠString Ġ{ ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠ Ġrender Decorated ( Unit , Ġ{ Ġ_, Ġ_ Ġ-> Ġ}, Ġ{ Ġstr Ġ-> Ġsb . append ( str ); ĠUnit Ġ}, Ġ{ Ġ_, Ġ_ Ġ-> Ġ}) ĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ public Ġfun Ġ< A , ĠB > ĠSimple Doc < A >. render Decorated ( ĊĠĠĠ Ġempty : ĠB , ĊĠĠĠ Ġcombine : Ġ( B , ĠB ) Ġ-> ĠB , ĊĠĠĠ Ġfrom String : Ġ( String ) Ġ-> ĠB , ĊĠĠĠ Ġannotate : Ġ( A , ĠB ) Ġ-> ĠB Ċ ): ĠB Ġ{ ĊĠĠĠ Ġval Ġan ns : ĠArray Deque < A > Ġ= ĠArray Deque () ĊĠĠĠ Ġtail rec Ġfun ĠSimple Doc < A >. go ( cont : ĠAnd Then < B , ĠB >): ĠB Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġd F Ġ= Ġun Doc ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Fail Ġ-> Ġthrow ĠIllegalStateException (" Unexpected ĠSimple Doc . Fail Ġin Ġrender ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Nil Ġ-> Ġcont ( empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Text Ġ-> Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( fromString ( d F . str ), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Line Ġ-> Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( fromString ("\ n ${ spaces ( d F . i )} "), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Add Annotation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan ns . add ( d F . ann ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd F . doc . go ( cont ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Remove Annotation Ġ-> Ġd F . doc . go ( cont . and Then Ġ{ Ġannotate ( ann s . remove Last (), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġgo ( And Then Ġ{ Ġit Ġ}) Ċ } Ċ Ċ public Ġfun Ġ< A , ĠB > ĠSimple Doc < A >. render Decorated ( ĊĠĠĠ Ġempty : ĠB , ĊĠĠĠ Ġcombine : Ġ( B , ĠB ) Ġ-> ĠB , ĊĠĠĠ Ġfrom String : Ġ( String ) Ġ-> ĠB , ĊĠĠĠ Ġadd Annotation : Ġ( A ) Ġ-> ĠB , ĊĠĠĠ Ġremove Annotation : Ġ( A ) Ġ-> ĠB Ċ ): ĠB Ġ{ ĊĠĠĠ Ġval Ġan ns : ĠArray Deque < A > Ġ= ĠArray Deque () ĊĠĠĠ Ġtail rec Ġfun ĠSimple Doc < A >. go ( cont : ĠAnd Then < B , ĠB >): ĠB Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġd F Ġ= Ġun Doc ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Fail Ġ-> Ġthrow ĠIllegalStateException (" Unexpected ĠSimple Doc . Fail Ġin Ġrender ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Nil Ġ-> Ġcont ( empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Text Ġ-> Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( fromString ( d F . str ), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Line Ġ-> Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( fromString ("\ n ${ spaces ( d F . i )} "), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Add Annotation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan ns . add Last ( d F . ann ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( add Annotation ( d F . ann ), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Doc F . Remove Annotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd F . doc . go ( cont . and Then Ġ{ Ġcombine ( remove Annotation ( ann s . remove Last ()), Ġit ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġgo ( And Then Ġ{ Ġit Ġ}) Ċ } Ċ