package Ġcom . github . pro log db . io . binary pro log Ċ Ċ import Ġcom . github . pro log db . runtime . query . And Query Ċ import Ġcom . github . pro log db . runtime . query . Or Query Ċ import Ġcom . github . pro log db . runtime . query . Predicate Query Ċ import Ġcom . github . pro log db . runtime . query . Query Ċ import Ġcom . github . pro log db . runtime . term .* Ċ import Ġjava . io . Data Output Ċ Ċ class ĠBinary Pro log Writer Ġ{ ĊĠĠĠ Ġprivate Ġval Ġterm Writ ers Ġ= Ġmutable Map Of < Class < out ĠTerm >, ĠTerm Writer <* >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub sequence Ġcalls Ġto ĠXXX Ġwill Ġuse Ġthe Ġgiven Ġwriter Ġto Ġwrite Ġterms Ġof ĊĠĠĠĠ Ġ* Ġthe Ġgiven Ġ[ term Class ]. ĠOver writes Ġprevious Ġinv ocations Ġwith Ġthe Ġsame ĊĠĠĠĠ Ġ* Ġ[ term Class ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠTerm > Ġregister Writer ( term Class : ĠClass < T >, Ġwriter : ĠTerm Writer < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġterm Writ ers [ term Class ] Ġ= Ġwriter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ throws ĠBinary Pro log Serialization Exception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Term To ( term : ĠTerm , Ġout : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= Ġfind Writer ( term :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠBinary Pro log Serialization Exception (" No Ġwriter Ġfor Ġterm Ġclass Ġ${ term :: class . java . simple Name } Ġregistered .") ĊĊĠĠĠĠĠĠĠ Ġwriter . write Term To ( term , Ġout , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Query To ( query : ĠQuery , Ġout : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠ ĠQuery Writer . write Query To ( query , Ġout , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠTerm > Ġfind Writer ( for Type : ĠClass < out ĠT >): ĠTerm Writer < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġby Direct Match Ġ= Ġterm Writ ers [ for Type ] ĊĠĠĠĠĠĠĠ Ġif Ġ( by Direct Match Ġ!= Ġnull ) Ġreturn Ġby Direct Match Ġas ĠTerm Writer < T > ĊĊĠĠĠĠĠĠĠ Ġval Ġkey By Subtype Ġ= Ġterm Writ ers . keys . first OrNull Ġ{ Ġit . isAssignableFrom ( for Type ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key By Subtype Ġ== Ġnull ) Ġnull Ġelse Ġterm Writ ers [ key By Subtype ] Ġas ĠTerm Writer < T > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTerm Writer < in ĠT Ġ: ĠTerm > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpro log TypeName : ĠString ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWrites Ġthe Ġgiven Ġterm Ġto Ġthe Ġgiven Ġ[ Data Output ], Ġincluding Ġthe Ġtype Ġbyte . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġwriter Ref ĠTo Ġbe Ġused Ġfor Ġnested Ġterms Ġof Ġunknown Ġtype ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġwrite Term To ( term : ĠT , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġinstance Ġof Ġ[ Binary Pro log Writer ] Ġwith Ġthe Ġdefault Ġconfiguration . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠgetDefault Instance (): ĠBinary Pro log Writer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠBinary Pro log Writer () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log Integer :: class . java , ĠInteger Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log Decimal :: class . java , ĠDecimal Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log Number :: class . java , ĠNumber Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Variable :: class . java , ĠVariable Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log String :: class . java , ĠString Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Atom :: class . java , ĠAtom Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Predicate :: class . java , ĠPredicate Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log List :: class . java , ĠList Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . register Writer ( Pro log Dictionary :: class . java , ĠDictionary Writer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwriter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠData Output . writeInt Encoded ( payload : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( payload Ġ<= Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte ( 0 b 1 0 0 0 _ 0 0 0 0 Ġor Ġpayload ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( payload Ġ<= Ġ 0 x 3 FFF ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 7 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) Ġor Ġ 0 b 1 0 0 0 _ 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( payload Ġ<= Ġ 0 x 1 F _ FFFF ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 1 4 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 7 ) Ġ Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) Ġor Ġ 0 b 1 0 0 0 _ 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( payload Ġ<= Ġ 0 xFF F _ FFFF ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 2 1 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 1 4 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 7 ) Ġ Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 ) Ġor Ġ 0 b 1 0 0 0 _ 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 2 8 ) Ġand Ġ 0 b 0 0 0 0 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 2 1 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 1 4 ) Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġ ush r Ġ 7 ) Ġ Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Byte (( payload Ġand Ġ 0 b 0 1 1 1 _ 1 1 1 ) Ġor Ġ 0 b 1 0 0 0 _ 0 0 0 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠInteger Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log Integer > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" integer " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE : ĠInt Ġ= Ġ 0 x 1 0 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log Integer , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( 8 ) ĊĠĠĠĠĠĠĠ Ġout . write Long ( term . value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠDecimal Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log Decimal > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" decimal " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE : ĠInt Ġ= Ġ 0 x 1 1 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log Decimal , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( 6 4 ) ĊĠĠĠĠĠĠĠ Ġout . write Double ( term . value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠNumber Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log Number > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" number " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ INTEGER Ġ= Ġ 0 x 1 0 ĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ DECIMAL Ġ= Ġ 0 x 1 1 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log Number , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( term . is Integer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ INTEGER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Long ( term . to Integer ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ DECIMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Double ( term . to Decimal ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠVariable Writer Ġ: ĠBinary Pro log Writer . Term Writer < Variable > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" variable " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ REG ULAR Ġ= Ġ 0 x 2 0 ĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ AN ONY MO US Ġ= Ġ 0 x 2 0 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠVariable , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( term Ġis ĠAn onymous Variable Ġ|| Ġterm . name Ġ== Ġ"_ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ AN ONY MO US ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ REG ULAR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Without Type Byte ( term , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Without Type Byte ( variable : ĠVariable , Ġout : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= ĠChar sets . UTF _ 8 . encode ( variable . name ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( encoded . limit ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( encoded . has Remaining ()) Ġout . write Byte ( encoded . get (). toInt ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠString Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log String > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" string " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE Ġ= Ġ 0 x 2 4 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log String , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= ĠChar sets . UTF _ 8 . encode ( term . to Kotlin String ()) ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( encoded . limit ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( encoded . has Remaining ()) Ġout . write Byte ( encoded . get (). toInt ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠAtom Writer Ġ: ĠBinary Pro log Writer . Term Writer < Atom > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" atom " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE Ġ= Ġ 0 x 2 2 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠAtom , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE ) ĊĠĠĠĠĠĠĠ Ġwrite Without Type Byte ( term . name , Ġout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Without Type Byte ( atom Name : ĠString , Ġout : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= ĠChar sets . UTF _ 8 . encode ( atom Name ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( encoded . limit ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( encoded . has Remaining ()) Ġout . write Byte ( encoded . get (). toInt ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠPredicate Writer Ġ: ĠBinary Pro log Writer . Term Writer < Predicate > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" predicate " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE Ġ= Ġ 0 x 3 0 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPredicate , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE ) ĊĠĠĠĠĠĠĠ Ġwrite Without Type Byte To ( term , Ġout , Ġwriter Ref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Without Type Byte To ( term : ĠPredicate , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( term . arity ) ĊĠĠĠĠĠĠĠ ĠAtom Writer . write Without Type Byte ( term . name , Ġout ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġterm . arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ref . write Term To ( argument , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠList Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log List > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" list " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ WITH _ TAIL Ġ= Ġ 0 x 3 1 ĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ WITHOUT _ TAIL Ġ= Ġ 0 x 3 2 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log List , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġterm . tail ĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Without Tail ( term . elements , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite With Tail ( term . elements , Ġtail , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite With Tail ( elements : ĠList < Term >, Ġtail : ĠVariable , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write ( TYPE _ BYTE _ WITH _ TAIL ) ĊĠĠĠĠĠĠĠ ĠVariable Writer . write Without Type Byte ( tail , Ġout ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( elements . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ref . write Term To ( element , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Without Tail ( elements : ĠList < Term >, Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write ( TYPE _ BYTE _ WITHOUT _ TAIL ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( elements . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ref . write Term To ( element , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠDictionary Writer Ġ: ĠBinary Pro log Writer . Term Writer < Pro log Dictionary > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpro log TypeName Ġ= Ġ" dictionary " ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ WITH _ TAIL Ġ= Ġ 0 x 4 0 ĊĠĠĠ Ġprivate Ġval ĠTYPE _ BYTE _ WITHOUT _ TAIL Ġ= Ġ 0 x 4 1 ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Term To ( term : ĠPro log Dictionary , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġterm . tail ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Without Tail ( term . pairs , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite With Tail ( term . pairs , Ġtail , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite With Tail ( entries : ĠMap < Atom , ĠTerm >, Ġtail : ĠVariable , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ WITH _ TAIL ) ĊĠĠĠĠĠĠĠ ĠVariable Writer . write Without Type Byte ( tail , Ġout ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( entries . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Entry ( entry , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Without Tail ( entries : ĠMap < Atom , ĠTerm >, Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( TYPE _ BYTE _ WITHOUT _ TAIL ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( entries . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Entry ( entry , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Entry ( entry : ĠMap . Entry < Atom , ĠTerm >, Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAtom Writer . write Without Type Byte ( entry . key . name , Ġout ) ĊĠĠĠĠĠĠĠ Ġwriter Ref . write Term To ( entry . value , Ġout ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠQuery Writer Ġ{ ĊĠĠĠ Ġfun Ġwrite Query To ( query : ĠQuery , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPredicate Query Ġ-> Ġwrite Predicate Query To ( query , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAnd Query Ġ-> Ġwrite Combined Query To ( 0 x 0 0 , Ġquery . goals , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOr Query Ġ-> Ġwrite Combined Query To ( 0 x 0 1 , Ġquery . goals , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠBinary Pro log Serialization Exception (" Query Ġtype Ġ${ query :: class . java . name } Ġnot Ġsupported Ġby Ġbinary Ġpro log Ġ 1 . 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Predicate Query To ( query : ĠPredicate Query , Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( 0 x 6 0 ) ĊĠĠĠĠĠĠĠ ĠPredicate Writer . write Without Type Byte To ( query . predicate , Ġout , Ġwriter Ref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Combined Query To ( operator Byte : ĠInt , Ġqueries : ĠArray < out ĠQuery >, Ġout : ĠData Output , Ġwriter Ref : ĠBinary Pro log Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Byte ( 0 x 6 1 ) ĊĠĠĠĠĠĠĠ Ġout . write Byte ( operator Byte ) ĊĠĠĠĠĠĠĠ Ġout . writeInt Encoded ( queries . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( sub Query Ġin Ġqueries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Query To ( sub Query , Ġout , Ġwriter Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }