/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠEP AM ĠSystems Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" EXPERIMENT AL _ FEATURE _ WARNING ") Ċ Ċ package Ġcom . ep am . drill . transport . stream Ċ Ċ import Ġcom . ep am . drill . transport . ByteArray Builder Ċ import Ġcom . ep am . drill . transport . exception .* Ċ import Ġcom . ep am . drill . transport . lang .* Ċ import Ġcom . ep am . drill . transport . read S 3 2 BE Ċ import Ġcom . ep am . drill . transport . read U 1 6 BE Ċ Ċ inline Ġval ĠByte . unsigned Ġget () Ġ= Ġthis . toInt () Ġand Ġ 0 xFF Ċ Ċ interface ĠAsync Closeable Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġclose () Ċ } Ċ Ċ interface ĠAsync Base Stream Ġ: ĠAsync Closeable Ċ Ċ interface ĠAsync InputStream Ġ: ĠAsync Base Stream Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġread ( buffer : ĠByteArray , Ġoffset : ĠInt , Ġlen : ĠInt ): ĠInt ĊĠĠĠ Ġsuspend Ġfun Ġread (): ĠInt Ġ= Ġsmall Bytes Pool . alloc 2 Ġ{ Ġif Ġ( read ( it , Ġ 0 , Ġ 1 ) Ġ> Ġ 0 ) Ġit [ 0 ]. unsigned Ġelse Ġ- 1 Ġ} Ċ } Ċ Ċ interface ĠAsync OutputStream Ġ: ĠAsync Base Stream Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġwrite ( buffer : ĠByteArray , Ġoffset : ĠInt Ġ= Ġ 0 , Ġlen : ĠInt Ġ= Ġbuffer . size Ġ- Ġoffset ) ĊĠĠĠ Ġsuspend Ġfun Ġwrite ( byte : ĠInt ) Ġ= Ġsmall Bytes Pool . alloc 2 Ġ{ Ġit [ 0 ] Ġ= Ġbyte . to Byte (); Ġwrite ( it , Ġ 0 , Ġ 1 ) Ġ} Ċ } Ċ Ċ interface ĠAsync Get Position Stream Ġ: ĠAsync Base Stream Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġget Position (): ĠLong Ġ= Ġthrow ĠUnsupportedOperationException () Ċ } Ċ Ċ interface ĠAsync GetLength Stream Ġ: ĠAsync Base Stream Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġget Length (): ĠLong Ġ= Ġthrow ĠUnsupportedOperationException () Ċ } ĊĊ Ċ interface ĠAsync InputStream With Length Ġ: ĠAsync InputStream , ĊĠĠĠ ĠAsync Get Position Stream , ĊĠĠĠ ĠAsync GetLength Stream Ċ Ċ fun ĠList < Async InputStream With Length >. combine (): ĠAsync InputStream With Length Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġthis ĊĠĠĠ Ġreturn Ġobject Ġ: ĠAsync InputStream With Length Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Position (): ĠLong Ġ= Ġlist . map Ġ{ Ġit . getPosition () Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Length (): ĠLong Ġ= Ġlist . map Ġ{ Ġit . getLength () Ġ}. sum () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġread ( buffer : ĠByteArray , Ġoffset : ĠInt , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . fast ForEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġi . read ( buffer , Ġoffset , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ> Ġ 0 ) Ġreturn Ġread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . fast ForEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ operator Ġfun ĠAsync InputStream With Length . plus ( other : ĠAsync InputStream With Length ): ĠAsync InputStream With Length Ġ= ĊĠĠĠ ĠlistOf ( this , Ġother ). combine () Ċ Ċ suspend Ġfun ĠAsync InputStream . read Exact ( buffer : ĠByteArray , Ġoffset : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġremaining Ġ= Ġlen ĊĠĠĠ Ġvar Ġc offset Ġ= Ġoffset ĊĠĠĠ Ġval Ġreader Ġ= Ġthis ĊĠĠĠ Ġwhile Ġ( remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġreader . read ( buffer , Ġc offset , Ġremaining ) ĊĠĠĠĠĠĠĠ Ġif Ġ( read Ġ< Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠ Ġif Ġ( read Ġ== Ġ 0 ) Ġthrow ĠEOF Exception (" Not Ġenough Ġdata . ĠExpected =$ len , ĠRead =${ len Ġ- Ġremaining }, ĠRem aining =$ remaining ") ĊĠĠĠĠĠĠĠ Ġc offset Ġ+= Ġread ĊĠĠĠĠĠĠĠ Ġremaining Ġ-= Ġread ĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ internal Ġsuspend Ġinline Ġfun Ġ< R > ĠAsync InputStream . read Small Temp Exact ( size : ĠInt , Ġcallback : ĠByteArray . () Ġ-> ĠR ): ĠR Ġ= ĊĠĠĠ Ġsmall Bytes Pool . alloc This Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġread ( this , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠ Ġif Ġ( read Ġ!= Ġsize ) Ġthrow ĠW s Exception (" Couldn 't Ġread Ġexact Ġsize =$ size Ġbut Ġread =$ read ") ĊĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠ Ġ} ĊĊ Ċ suspend Ġfun ĠAsync InputStream . read Bytes Exact ( len : ĠInt ): ĠByteArray Ġ= ĠByteArray ( len ). apply Ġ{ Ġread Exact ( this , Ġ 0 , Ġlen ) Ġ} Ċ suspend Ġfun ĠAsync InputStream . read U 8 (): ĠInt Ġ= Ġread () Ċ suspend Ġfun ĠAsync InputStream . read U 1 6 BE (): ĠInt Ġ= Ġread Small Temp Exact ( 2 ) Ġ{ Ġread U 1 6 BE ( 0 ) Ġ} Ċ suspend Ġfun ĠAsync InputStream . read S 3 2 BE (): ĠInt Ġ= Ġread Small Temp Exact ( 4 ) Ġ{ Ġread S 3 2 BE ( 0 ) Ġ} Ċ Ċ suspend Ġfun ĠAsync OutputStream . write Bytes ( data : ĠByteArray ): ĠUnit Ġ= Ġwrite ( data , Ġ 0 , Ġdata . size ) Ċ Ċ suspend Ġfun ĠAsync InputStream . readLine ( eol : ĠChar Ġ= Ġ'\ n ', Ġcharset : ĠCharset Ġ= ĠUTF 8 ): ĠString Ġ{ ĊĠĠĠ Ġval Ġtemp Ġ= ĠByteArray ( 1 ) ĊĠĠĠ Ġval Ġout Ġ= ĠByteArray Builder () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġrun Ġ{ Ġread Exact ( temp , Ġ 0 , Ġ 1 ); Ġtemp [ 0 ] Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . to Char () Ġ== Ġe ol ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠEOF Exception ) Ġ{ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġout . toByteArray (). toString ( charset ) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠList < T >. fast ForEach ( callback : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( n Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback ( this [ n ++ ]) ĊĠĠĠ Ġ} Ċ } Ċ