// Ċ // Ġ ĠRedirect Machine . kt Ċ // Ġ Ġsimp rok machine Ċ // Ċ // Ġ ĠCreated Ġby ĠAnd rey ĠPro kh oren ko Ġon Ġ 1 2 . 0 3 . 2 0 2 2 . Ċ // Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 2 Ġsimp rok . ĠAll Ġrights Ġreserved . Ċ Ċ package Ġcom . simp rok . simp rok machine . machines Ċ Ċ import Ġcom . simp rok . simp rok machine . api . Direction Ċ import Ġcom . simp rok . simp rok machine . api . Handler Ċ import Ġcom . simp rok . simp rok machine . api . Mapper Ċ import Ġcom . simp rok . simp rok machine . implementation . pair Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . map Ċ Ċ internal Ġclass ĠRedirect Machine < Input , ĠOutput >( ĊĠĠĠ Ġinternal Ġval Ġsupplier : ĠMapper < Coroutine Scope , ĠPair < Flow < Output >, ĠHandler < Input >>> Ċ ) Ġ: ĠMachine < Input , ĠOutput > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Input , ĠOutput > Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild : ĠMachine < Input , ĠOutput >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper : ĠMapper < Output , ĠDirection < Input >>, ĊĠĠĠĠĠĠĠ Ġ): ĠMachine < Input , ĠOutput > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRedirect Machine Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġchild . pair ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġpair . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġpair . first . map Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġdirection Ġ= Ġmapper ( output )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDirection . Back < Input > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection . values . forEach Ġ{ Ġsetter ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( false , Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDirection . Prop < Input > Ġ-> ĠPair ( true , Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ Ġit . first Ġ}. map Ġ{ Ġit . second Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( flow , Ġsetter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }