package Ġarrow . core Ċ Ċ import Ġarrow . Kind Ċ import Ġarrow . high er kind Ċ import Ġarrow . type classes . Applic ative Ċ Ċ @ high er kind Ċ data Ġclass ĠSequence K < out ĠA >( val Ġsequence : ĠSequence < A >) Ġ: ĠSequence K Of < A >, ĠSequence < A > Ġby Ġsequence Ġ{ ĊĊĠ Ġfun Ġ< B > Ġflat Map ( f : Ġ( A ) Ġ-> ĠSequence K Of < B >): ĠSequence K < B > Ġ= Ġsequence . flatMap Ġ{ Ġf ( it ). fix (). sequence Ġ}. k () ĊĊĠ Ġfun Ġ< B > Ġap ( ff : ĠSequence K Of <( A ) Ġ-> ĠB >): ĠSequence K < B > Ġ= Ġflat Map Ġ{ Ġa Ġ-> Ġff . fix (). map Ġ{ Ġf Ġ-> Ġf ( a ) Ġ} Ġ} ĊĊĠ Ġfun Ġ< B > Ġmap ( f : Ġ( A ) Ġ-> ĠB ): ĠSequence K < B > Ġ= Ġsequence . map ( f ). k () ĊĊĠ Ġfun Ġ< B > Ġfold Left ( b : ĠB , Ġf : Ġ( B , ĠA ) Ġ-> ĠB ): ĠB Ġ= Ġfold ( b , Ġf ) ĊĊĠ Ġfun Ġ< B > Ġfold Right ( lb : ĠEval < B >, Ġf : Ġ( A , ĠEval < B >) Ġ-> ĠEval < B >): ĠEval < B > Ġ{ ĊĠĠĠ Ġfun ĠIterator < A >. loop (): ĠEval < B > Ġ= ĊĠĠĠĠĠ Ġif Ġ( hasNext ()) Ġf ( next (), ĠEval . defer Ġ{ Ġloop () Ġ}) Ġelse Ġlb ĊĠĠĠ Ġreturn ĠEval . defer Ġ{ Ġthis . iterator (). loop () Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ< G , ĠB > Ġtraverse ( GA : ĠApplic ative < G >, Ġf : Ġ( A ) Ġ-> ĠKind < G , ĠB >): ĠKind < G , ĠSequence K < B >> Ġ= ĊĠĠĠ Ġfold Right ( Eval . now ( GA . just ( emptyList < B >(). k ()))) Ġ{ Ġa , Ġeval Ġ-> ĊĠĠĠĠĠ ĠGA . run Ġ{ ĠEval . later Ġ{ Ġf ( a ). lazy Ap Ġ{ Ġeval . value (). map Ġ{ Ġxs Ġ-> Ġ{ Ġb : ĠB Ġ-> Ġ( listOf ( b ) Ġ+ Ġxs ). k () Ġ} Ġ} Ġ} Ġ} Ġ} ĊĠĠĠ Ġ}. value (). let Ġ{ ĠGA . run Ġ{ Ġit . map Ġ{ Ġit . as Sequence (). k () Ġ} Ġ} Ġ} ĊĊĠ Ġfun Ġ< B , ĠZ > Ġmap 2 ( fb : ĠSequence K Of < B >, Ġf : Ġ( Tuple 2 < A , ĠB >) Ġ-> ĠZ ): ĠSequence K < Z > Ġ= ĊĠĠĠ Ġflat Map Ġ{ Ġa Ġ-> ĊĠĠĠĠĠ Ġfb . fix (). map Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠ Ġf ( Tuple 2 ( a , Ġb )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġ< B > Ġfilter Map ( f : Ġ( A ) Ġ-> ĠOption < B >): ĠSequence K < B > Ġ= ĊĠĠĠ Ġmap ( f ). filter Ġ{ Ġit . isDefined () Ġ}. map Ġ{ Ġit . or Null () !! Ġ}. k () ĊĊĠ Ġfun Ġto List (): ĠList < A > Ġ= Ġthis . fix (). sequence . toList () ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġfun Ġ< A > Ġjust ( a : ĠA ): ĠSequence K < A > Ġ= Ġsequence Of ( a ). k () ĊĊĠĠĠ Ġfun Ġ< A > Ġempty (): ĠSequence K < A > Ġ= Ġempty Sequence < A >(). k () ĊĊĠĠĠ Ġfun Ġ< A , ĠB > Ġtail Rec M ( a : ĠA , Ġf : Ġ( A ) Ġ-> ĠSequence K Of < Either < A , ĠB >> ): ĠSequence K < B > Ġ{ ĊĠĠĠĠĠ Ġtail rec Ġfun Ġ< A , ĠB > Ġgo ( ĊĠĠĠĠĠĠĠ Ġbuf : ĠMutable List < B >, ĊĠĠĠĠĠĠĠ Ġf : Ġ( A ) Ġ-> ĠSequence K Of < Either < A , ĠB >>, ĊĠĠĠĠĠĠĠ Ġv : ĠSequence K < Either < A , ĠB >> ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v . toList (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġhead : ĠEither < A , ĠB > Ġ= Ġv . first () ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Ġ+= Ġhead . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo ( buf , Ġf , Ġv . drop ( 1 ). k ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . count () Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo ( buf , Ġf , Ġ( f ( head . a ). fix ()). k ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo ( buf , Ġf , Ġ( f ( head . a ). fix () Ġ+ Ġv . drop ( 1 )). k ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġbuf Ġ= Ġmutable ListOf < B >() ĊĠĠĠĠĠ Ġgo ( buf , Ġf , Ġf ( a ). fix ()) ĊĠĠĠĠĠ Ġreturn ĠSequence K ( buf . as Sequence ()) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< A > ĠSequence K Of < A >. combine K ( y : ĠSequence K Of < A >): ĠSequence K < A > Ġ= Ġ( fix (). sequence Ġ+ Ġy . fix (). sequence ). k () Ċ Ċ fun Ġ< A , ĠG > ĠSequence K Of < Kind < G , ĠA >> . sequence ( GA : ĠApplic ative < G >): ĠKind < G , ĠSequence K < A >> Ġ= ĊĠ Ġfix (). traverse ( GA , Ġ:: identity ) Ċ Ċ fun Ġ< A > ĠSequence < A >. k (): ĠSequence K < A > Ġ= ĠSequence K ( this ) Ċ