package main
import (
"fmt"
)
type Rectangle[T any] struct {
Width T
Height T
}
func NewRectangle[T any](width, height T) *Rectangle[T] {
return &Rectangle[T]{Width: width, Height: height}
}
func (r *Rectangle[T]) Area(mul func(T, T) T) T {
return mul(r.Width, r.Height)
}
func (r *Rectangle[T]) Perimeter(add func(T, T) T) T {
return add(add(r.Width, r.Height), add(r.Width, r.Height))
}
func main() {
intMul := func(a, b int) int { return a * b }
intAdd := func(a, b int) int { return a + b }
floatMul := func(a, b float64) float64 { return a * b }
floatAdd := func(a, b float64) float64 { return a + b }
rect1 := NewRectangle(3, 4) rect2 := NewRectangle(3.5, 4.5)
fmt.Printf("Rectangle 1: %+v\n", *rect1)
fmt.Printf("Area: %d\n", rect1.Area(intMul))
fmt.Printf("Perimeter: %d\n", rect1.Perimeter(intAdd))
fmt.Printf("Rectangle 2: %+v\n", *rect2)
fmt.Printf("Area: %.2f\n", rect2.Area(floatMul))
fmt.Printf("Perimeter: %.2f\n", rect2.Perimeter(floatAdd))
}