### Geometry interface

The Geometry type and operators over it: (Note that we distinguish between one and two dimensional geometries.)

```
data Geometry =
= Space GHint
| Geo
{- hint X -}
GHint
{- hint Y -}
GHint
deriving (Eq,Text)

data GHint =
GHint
{- *Natural* size -}
GLength
{- *Minimum* size -}
GLength
{- stretchiness (order and value within that order) -}
(WillOrder,Willingness)
{- squashiness -}
(WillOrder,Willingness)
deriving (Eq,Text)

type Willingness = Int
type WillOrder = Int
type GLength = Int

{- construct new geometry with specified nat. and min size -}
newGeometry :: Size -> Size -> Geometry
{- create space, or a one dimensional geometry -}
newSpace :: Size -> Geometry

{- set the stretch- or squashiness for geometry along one axis -}
setGeoStretch :: Axis -> (Willingness,WillOrder) -> Geometry -> Geometry
setGeoSquash  :: Axis -> (Willingness,WillOrder) -> Geometry -> Geometry

{- return stretch- or squashiness along either axis. -}
getGeoStretch :: Axis -> Geometry -> (Willingness,WillOrder)
getGeoSquash  :: Axis -> Geometry -> (Willingness,WillOrder)

{- get the natural size -}
getGeoNatSize :: Geometry -> Size
{- return the minimum size -}
getGeoMinSize :: Geometry -> Size

{- set the natural length or size  -}
setGeoNatLength :: Axis -> GLength  -> Geometry -> Geometry
setGeoNatSize   :: Size -> Geometry -> Geometry
setGeoMinSize   :: Size -> Geometry -> Geometry

{- add amount to the natural and min. size of a geometry -}
augmentGeo :: Size -> Geometry -> Geometry
{- set the natural *and* minimum size -}
setGeoSize :: Size -> Geometry -> Geometry

{- geometry with no size and no desire to change -}
nullGeo   :: Geometry
nullGHint :: GHint

```