package Ġjp . co . sor am its u . feature _ wallet _ impl . data . storage Ċ Ċ import Ġjp . co . sor am its u . common . data . storage . Preferences Ċ import Ġkotlinx . coroutines . flow . filter NotNull Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . map Ċ Ċ private Ġconst Ġval ĠTRAN SACTION S _ CURSOR _ KEY Ġ= Ġ" TRANSACTION S _ CURSOR _ KEY " Ċ Ċ // Ġto Ġdistinguish Ġbetween Ġno Ġcursor Ġand Ġnull Ġcursor Ġintroduce Ġa Ġseparate Ġvalue Ġfor Ġ` null ` Ġcursor . Ċ // ĠNull Ġvalue Ġin Ġpreferences Ġwill Ġcorrespond Ġto Ġ` no Ġcursor ` Ġstate Ċ private Ġconst Ġval ĠNULL _ CURSOR Ġ= Ġ" NULL _ CURSOR " Ċ Ċ class ĠTransfer Cursor Storage ( ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠPreferences Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġsave Cursor ( address : ĠString , Ġcursor : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Save Ġ= Ġcursor Ġ?: ĠNULL _ CURSOR ĊĊĠĠĠĠĠĠĠ Ġpreferences . putString ( cursor Key ( address ), Ġto Save ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Cursor ( address : ĠString ) Ġ= Ġpreferences . string Flow ( cursor Key ( address )) ĊĠĠĠĠĠĠĠ Ġ. filter NotNull () Ġ// Ġsus p ends Ġuntil Ġcursor Ġis Ġinserted ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠNULL _ CURSOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. first () ĊĊĠĠĠ Ġprivate Ġfun Ġcursor Key ( address : ĠString ) Ġ= ĠTRAN SACTION S _ CURSOR _ KEY Ġ+ Ġaddress Ċ } Ċ