package Ġthe sis . preprocess . types Ċ Ċ import Ġthe sis . preprocess . Processor Ċ import Ġthe sis . preprocess . expressions . Kind Ċ import Ġthe sis . preprocess . expressions . TypeName Ċ import Ġthe sis . preprocess . expressions . algebra ic . type . Algebra ic Type Ċ import Ġthe sis . preprocess . expressions . algebra ic . type . Raw Algebra ic Type Ċ import Ġthe sis . preprocess . expressions . type . Parame tri sed Ċ import Ġthe sis . preprocess . expressions . type . Type Ċ Ċ /** Ċ Ġ* ĠInf ers Ġtype Ġinformation Ġfor Ġalgebra ic Ġtypes Ċ Ġ* Ċ Ġ* Ġ@ author ĠDan il ĠK ol ik ov Ċ Ġ*/ Ċ class ĠAl gebra ic Type Inference Processor Ġ: ĊĠĠĠĠĠĠĠ ĠProcessor < Linked HashMap < TypeName , ĠRaw Algebra ic Type >, ĠLinkedHashMap < TypeName , ĠAl gebra ic Type >> Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠLinkedHashMap < TypeName , ĠRaw Algebra ic Type > ĊĠĠĠ Ġ): ĠLinkedHashMap < TypeName , ĠAl gebra ic Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLinkedHashMap < TypeName , ĠAl gebra ic Type >() ĊĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġ( name , Ġtype ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġtype Ġto Ġresult Ġbefore Ġinf erring Ġof Ġit 's Ġstructure Ġto Ġsupport Ġrecursive Ġtypes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠKind . create Basic ( type . parameters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Oper ands Ġ= Ġmutable ListOf < Algebra ic Type . Structure . Sum Operand >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= ĠLinkedHashMap < TypeName , ĠAl gebra ic Type . Constructor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= ĠAl gebra ic Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAl gebra ic Type . Structure ( new Oper ands ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . structure . operands . any Ġ{ Ġit . contains Type ( name ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ name ] Ġ= Ġresult Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn fer Ġtype Ġstructure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . structure . operands . map Ġ{ Ġoperand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( operand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRaw Algebra ic Type . Structure . Sum Operand . Literal Ġ-> ĠAl gebra ic Type . Structure . Sum Operand . Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperand . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRaw Algebra ic Type . Structure . Sum Operand . Product Ġ-> ĠAl gebra ic Type . Structure . Sum Operand . Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperand . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperand . operands . map Ġ{ Ġit . to Algebra ic Type ( result ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġnew Oper ands . add ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn fer Ġtype Ġconstructors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcur Constructor Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Oper ands . forEach Ġ{ Ġoperand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Name Ġ= Ġoperand . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Type Ġ= ĠType . Application ( result Type , Ġresult Type . parameters . map Ġ{ ĠType . Variable ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Type Ġ= Ġwhen Ġ( operand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAl gebra ic Type . Structure . Sum Operand . Object Ġ-> Ġres Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAl gebra ic Type . Structure . Sum Operand . Product Ġ-> Ġoperand . operands ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold Right < Algebra ic Type . Structure . Product Operand , ĠType >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġarg , Ġres Ġ-> ĠType . Function ( arg . to Type (), Ġres ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparame tri sed Ġ= ĠPar ame tri sed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . parameters . map Ġ{ Ġit Ġto ĠType . Variable ( it ) Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors [ constructor Name ] Ġ= ĠAl gebra ic Type . Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparame tri sed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Constructor ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRaw Algebra ic Type . Structure . Product Operand . to Algebra ic Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefined : ĠMap < TypeName , ĠAl gebra ic Type > ĊĠĠĠ Ġ): ĠAl gebra ic Type . Structure . Product Operand Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRaw Algebra ic Type . Structure . Product Operand . Variable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAl gebra ic Type . Structure . Product Operand . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠRaw Algebra ic Type . Structure . Product Operand . Application Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAl gebra ic Type . Structure . Product Operand . Application ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefined [ name ] Ġ?: Ġthrow ĠUnknown TypeError ( name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . map Ġ{ Ġit . to Algebra ic Type ( defined ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAl gebra ic Type . Structure . Product Operand . to Type (): ĠType Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAl gebra ic Type . Structure . Product Operand . Variable Ġ-> ĠType . Variable ( name ) ĊĠĠĠĠĠĠĠ Ġis ĠAl gebra ic Type . Structure . Product Operand . Application Ġ-> ĠType . Application ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . map Ġ{ Ġit . to Type () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }