package Ġcore . vector Ċ Ċ import Ġcore . differ ential . Deriv ative Ċ Ċ abstract Ġclass ĠFunction Wrapper < in ĠA , Ġout ĠB >( private Ġval Ġfunction : Ġ( A ) Ġ-> ĠB ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠA ): ĠB Ġ= Ġfunction ( other ) ĊĠĠĠ Ġoperator Ġfun Ġ< Input > Ġinvoke ( other : Ġ( Input ) Ġ-> Ġ( A )) Ġ= Ġ{ Ġinput : ĠInput Ġ-> ĊĠĠĠĠĠĠĠ Ġthis ( other ( input )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠDouble Function ( function : Ġ( Double ) Ġ-> ĠDouble ) Ġ: ĠFunction Wrapper < Double , ĠDouble >( function ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠDouble Function ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠDouble Function ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble Function ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble Function ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother ( a ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠDouble ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠDouble ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠDouble Function ) Ġ= ĠDouble Function ( this ( other :: invoke )) ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠScalar Field ) Ġ= ĠScalar Field ( this ( other :: invoke )) Ċ } Ċ Ċ open Ġclass ĠVector Val ued Function ( function : Ġ( Double ) Ġ-> ĠDouble Vector ) Ġ: ĠFunction Wrapper < Double , ĠDouble Vector >( function ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠVector Val ued Function ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠVector Val ued Function ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠVector Val ued Function ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġin fix Ġfun Ġcross ( other : ĠVector Val ued Function ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ). to 3 D Ġcross Ġother ( a ). to 3 D Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠDouble Vector ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠDouble Vector ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble Vector ) Ġ= ĠDouble Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġin fix Ġfun Ġcross ( other : ĠDouble Vector ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ). to 3 D Ġcross Ġother . to 3 D Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble Function ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble Function ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother ( a ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble ) Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother Ġ} ĊĊĠĠĠ Ġval Ġunit Tangent Ġget () Ġ= ĠVector Val ued Function Ġ{ Ġa Ġ-> Ġ( Deriv ative Ġ* Ġthis )( a ). unit Ġ} ĊĠĠĠ Ġval Ġprincipal Unit Normal Ġget () Ġ= Ġunit Tangent . unit Tangent ĊĊĠĠĠ Ġval Ġcur v ature ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDouble Function Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Deriv ative Ġ* Ġunit Tangent )( a ). magnitude Ġ/ Ġ( Deriv ative Ġ* Ġthis )( a ). magnitude ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠDouble Function ) Ġ= ĠVector Val ued Function ( this ( other :: invoke )) ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠScalar Field ) Ġ= ĠVector Field ( this ( other :: invoke )) Ċ } Ċ Ċ open Ġclass ĠScalar Field ( function : Ġ( Double Vector ) Ġ-> ĠDouble ) Ġ: ĠFunction Wrapper < Double Vector , ĠDouble >( function ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠScalar Field ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠScalar Field ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠScalar Field ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠScalar Field ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother ( a ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble Vector ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġother Ġ* Ġthis ( a ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠDouble ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠDouble ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠVector Val ued Function ) Ġ= ĠDouble Function ( this Ġ{ Ġi : ĠDouble Ġ-> Ġother ( i ) Ġ}) ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠVector Field ) Ġ= ĠScalar Field ( this Ġ{ Ġi : ĠDouble Vector Ġ-> Ġother ( i ) Ġ}) Ċ } Ċ Ċ open Ġclass ĠVector Field ( function : Ġ( Double Vector ) Ġ-> ĠDouble Vector ) Ġ: ĠFunction Wrapper < Double Vector , ĠDouble Vector >( function ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠVector Field ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠVector Field ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠVector Field ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġin fix Ġfun Ġcross ( other : ĠVector Field ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ). to 3 D Ġcross Ġother ( a ). to 3 D Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠScalar Field ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother ( a ) Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠScalar Field ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother ( a ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠDouble Vector ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ+ Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠDouble Vector ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ- Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble Vector ) Ġ= ĠScalar Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġin fix Ġfun Ġcross ( other : ĠDouble Vector ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ). to 3 D Ġcross Ġother . to 3 D Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ* Ġother Ġ} ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble ) Ġ= ĠVector Field Ġ{ Ġa Ġ-> Ġthis ( a ) Ġ/ Ġother Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠVector Val ued Function ) Ġ= ĠVector Val ued Function ( this ( other :: invoke )) ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( other : ĠVector Field ) Ġ= ĠVector Field ( this ( other :: invoke )) Ċ }