// ==========================================================================
// $Id: lambda.go,v 1.1 2014/03/27 03:27:49 jlang Exp $
// CSI2120 GO: Lambdas
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   EECS, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada. 
//   http://www.eecs.uottawa.ca
// 
// Creator: Jochen Lang (based on example by R. Laganiere)
// Email:   jlang@eecs.uottawa.ca
// ==========================================================================
// $Log: lambda.go,v $
// Revision 1.1  2014/03/27 03:27:49  jlang
// Created Go examples for intro lecture.
//
// ==========================================================================
package main

import (
	"fmt"
	"math"
)

type Point struct {
	x float64
	y float64
}

func Distance(p1 Point, p2 Point) (distance float64){
	distance = math.Sqrt(math.Pow(p1.x - p2.x, 2.0) + 
		math.Pow(p1.y - p2.y, 2.0))
	return
}

func calc(p1 Point, p2 Point,  
	d func(Point, Point)(float64))(float64) {
	return d(p1,p2)
}

func main() {
	a := Point{2.,4.}
	b := Point{5.,9.}

	dist := calc(a,b,Distance)
	
	fmt.Printf("result= %f\n", dist)
	
	dist = calc(a,b,func(p Point, q Point)float64{
		return math.Abs(p.x-q.x)+math.Abs(p.y-q.y)})
	
	fmt.Printf("result= %f\n", dist)
}
