packages feed

kempe-0.2.0.8: lib/gaussian.kmp

; Gaussian integers
import"prelude/fn.kmp"

type Gaussian { Gaussian Int Int }

unGaussian : Gaussian -- Int Int
           =: [ {case | Gaussian ->} ]

grp : a b c -- b a c
    =: [ dip(swap) ]

; perhaps unimpressive but I use this to test sizing
add : Gaussian Gaussian -- Gaussian
    =: [ dip(unGaussian) unGaussian grp + dip(+) Gaussian ]

multRe : Gaussian Gaussian -- Int
       =: [ dip(unGaussian) unGaussian dip(swap) * dip(*) - ]

multIm : Gaussian Gaussian -- Int
       =: [ dip(unGaussian) unGaussian dip(*) swap dip(*) + ]

mult : Gaussian Gaussian -- Gaussian
     =: [ dup2 multIm dip(multRe) Gaussian ]

conjugate : Gaussian -- Gaussian
          =: [ unGaussian ~ Gaussian ]

%foreign kabi add
%foreign kabi conjugate
%foreign kabi mult