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