package Ġcom . so yle . stories . use case . pro se . bulk Update Pro se Ċ Ċ import Ġcom . so yle . stories . domain . pro se . Pro se Ċ import Ġcom . so yle . stories . domain . pro se . events . Pro se Event Ċ import Ġcom . so yle . stories . use case . pro se . Pro se DoesNotExist Ċ import Ġcom . so yle . stories . use case . pro se . Pro se Repository ĊĊ Ċ class ĠBulk Update Pro se UseCase ( private Ġval Ġpro se Repository : ĠPro se Repository ) Ġ: ĠBulk Update Pro se Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke ( pro se Id : ĠPro se . Id , Ġrevision : ĠLong , Ġoperations : ĠList < Operation >, Ġoutput : ĠBulk Update Pro se . Output Port ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġpro se Repository . get Pro se ById ( pro se Id ) Ġ?: Ġthrow ĠPro se DoesNotExist ( pro se Id ) ĊĠĠĠĠĠĠĠ Ġval Ġevents Since Revision Ġ= Ġpro se Repository . get Pro se Events ( pro se . id , Ġrevision ) ĊĠĠĠĠĠĠĠ Ġval Ġcollected Events Ġ= Ġmutable ListOf < Pro se Event >() ĊĠĠĠĠĠĠĠ Ġval Ġupdated Pro se Ġ= Ġoperations . with Events Applied ( events Since Revision ). fold ( pro se ) Ġ{ Ġnext Pro se , Ġoperation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInsert Text Ġ-> Ġnext Pro se . with Text Inserted ( operation . text , Ġoperation . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM ention Entity Ġ-> Ġnext Pro se . with Entity Mention ed ( operation . entityId , Ġoperation . index , Ġoperation . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Events . add ( update . event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpro se Repository . add Events ( pro se . id , Ġcollected Events ) ĊĠĠĠĠĠĠĠ Ġpro se Repository . replace Pro se ( updated Pro se ) ĊĠĠĠĠĠĠĠ Ġoutput . receive Bulk Update Response ( Bulk Update Pro se . Response Model ( collected Events )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Operation >. with Events Applied ( events : ĠList < Pro se Event >): ĠList < Operation > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . apply Events ( events ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠOperation . apply Events ( events : ĠList < Pro se Event >): ĠOperation ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġevents . fold < Pro se Event , ĠOperation ? >( this ) Ġ{ Ġnext Operation , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Operation ?. transform ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }