```{-# OPTIONS -fno-warn-missing-methods #-}
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
module Graphics.Gloss.Data.Point
( Point
, pointInBox)
where

-- | A point on the x-y plane.
--   Points can also be treated as `Vector`s, so "Graphics.Gloss.Data.Vector" may also be useful.
type Point	= (Float, Float)

-- | Pretend a point is a number.
--	Vectors aren't real numbes according to Haskell, because they don't
--	support the multiply and divide field operators. We can pretend they
--	are though, and use the (+) and (-) operators as component-wise
--
instance Num Point where
(+) (x1, y1) (x2, y2)	= (x1 + x2, y1 + y2)
(-) (x1, y1) (x2, y2)	= (x1 - x2, y1 - y2)
negate (x, y)		= (negate x, negate y)

-- | Test whether a point lies within a rectangular box that is oriented
--   on the x-y plane. The points P1-P2 are opposing points of the box,
--   but need not be in a particular order.
--
-- @
--    P2 +-------+
--       |       |
--       | + P0  |
--       |       |
--       +-------+ P1
-- @
--
pointInBox
:: Point
-> Point
-> Point -> Bool

pointInBox (x0, y0) (x1, y1) (x2, y2)
=  x0 >= min x1 x2
&& x0 <= max x1 x2
&& y0 >= min y1 y2
&& y0 <= max y1 y2
```