Portability | GHC with TypeFamilies and more |
---|---|

Stability | unstable |

Maintainer | stephen.tetley@gmail.com |

Type classes and derived functions to compose 2D *pictures*.

The operations are fairly standard - see Regions in Paul Hudak's 'The Haskell School of Expression' and the pretty printing libraries wl-pprint and Text.PrettyPrint.HughesPJ (pretty printing combinators are some ways in 'One and a half D' as they have horizontal operations but only carriage return in the vertical.

WARNING - this module may change in detail if not in spirit quite significantly in future.

These drawing operations are pretty fundamental and a compentent functional drawing program should provide them in some formulation. However the implementation herein needs some more thought.

- data HAlign
- data VAlign
- type family PUnit a
- class Horizontal a where
- class Vertical a where
- class Composite a where
- class Move a where
- class Blank a where
- center :: (Horizontal a, Vertical a, Fractional u, u ~ PUnit a) => a -> Point2 u
- topleft :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 u
- topright :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 u
- bottomleft :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 u
- bottomright :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 u
- (-@-) :: (Horizontal a, Vertical a, Composite a, Move a, Fractional u, u ~ PUnit a) => a -> a -> a
- (->-) :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> a -> a
- (-<-) :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> a -> a
- (-//-) :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> a
- above :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> a
- below :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> a
- at :: (Move a, u ~ PUnit a) => a -> Point2 u -> a
- centeredAt :: (Horizontal a, Vertical a, Move a, Composite a, Blank a, Fractional u, u ~ PUnit a) => a -> Point2 u -> a
- stackOnto :: Composite a => [a] -> a -> a
- hcat :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> [a] -> a
- vcat :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> [a] -> a
- stackOntoCenter :: (Horizontal a, Vertical a, Composite a, Move a, Fractional u, u ~ PUnit a) => [a] -> a -> a
- hspace :: (Num u, Composite a, Horizontal a, Blank a, u ~ PUnit a) => u -> a -> a -> a
- vspace :: (Num u, Composite a, Vertical a, Blank a, u ~ PUnit a) => u -> a -> a -> a
- hsep :: (Num u, Composite a, Horizontal a, Blank a, u ~ PUnit a) => u -> a -> [a] -> a
- vsep :: (Num u, Composite a, Vertical a, Blank a, u ~ PUnit a) => u -> a -> [a] -> a
- alignH :: (Fractional u, Composite a, Horizontal a, Vertical a, Move a, u ~ PUnit a) => HAlign -> a -> a -> a
- alignV :: (Fractional u, Composite a, Horizontal a, Vertical a, Move a, u ~ PUnit a) => VAlign -> a -> a -> a
- hcatA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, u ~ PUnit a) => HAlign -> a -> [a] -> a
- vcatA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, u ~ PUnit a) => VAlign -> a -> [a] -> a
- hsepA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, Blank a, u ~ PUnit a) => HAlign -> u -> a -> [a] -> a
- vsepA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, Blank a, u ~ PUnit a) => VAlign -> u -> a -> [a] -> a
- multilabel :: (Fractional u, Floating u, Ord u, TextLabel t) => t -> u -> VAlign -> [String] -> Point2 u -> Picture u

# Data types for alignment

Horizontal alignment - align to the top, center or bottom.

Vertical alignment - align to the left, center or bottom.

# Type family and classes

Move vertically.

a `over` b

Place 'picture' a over b. The idea of `over`

here is the same
as z-ordering in 2D design programs. Implementations of this
class should 'draw' picture a over b but move neither.

Similarly `beneath`

should 'draw' the first picture behind
the second but move neither.

Beneath has a default definition:

beneath = flip over

Move in both the horizontal and vertical.

Create a *picture* that has no content but occupies space
(i.e. it has a bounding box).

# Bounds

Corresponding operations are available on bounding boxes - the definitions here have different type class obligations.

center :: (Horizontal a, Vertical a, Fractional u, u ~ PUnit a) => a -> Point2 uSource

The center of a picture.

topleft :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 uSource

Extract the top-left corner.

topright :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 uSource

Extract the top-right corner.

bottomleft :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 uSource

Extract the bottom-left corner.

bottomright :: (Horizontal a, Vertical a, u ~ PUnit a) => a -> Point2 uSource

Extract the bottom-right corner.

# Composition

(-@-) :: (Horizontal a, Vertical a, Composite a, Move a, Fractional u, u ~ PUnit a) => a -> a -> aSource

a -@- b

Center `a`

on top of `b`

, `a`

is potentially moved and drawn
`over`

`b`

.

(->-) :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> a -> aSource

a ->- b

Horizontal composition - move `b`

, placing it to the right
of `a`

.

(-<-) :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> a -> aSource

a -<- b

Horizontal composition - move `a`

, placing it to the left
of `b`

.

(-//-) :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> aSource

a -//- b

Vertical composition - move `b`

, placing it below `a`

.

above :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> aSource

a `above` b

Vertical composition - move `a`

, placing it above `b`

.

below :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> a -> aSource

a `below` b

Vertical composition - move `a`

, placing it below `b`

centeredAt :: (Horizontal a, Vertical a, Move a, Composite a, Blank a, Fractional u, u ~ PUnit a) => a -> Point2 u -> aSource

Center the picture at the supplied point.

hcat :: (Horizontal a, Composite a, Num u, u ~ PUnit a) => a -> [a] -> aSource

x ->- xs

Concatenate the list pictures `xs`

horizontally with `(->-)`

starting at `x`

.

vcat :: (Vertical a, Composite a, Num u, u ~ PUnit a) => a -> [a] -> aSource

x -//- xs

Concatenate the list of pictures `xs`

vertically with `(-//-)`

starting at `x`

.

stackOntoCenter :: (Horizontal a, Vertical a, Composite a, Move a, Fractional u, u ~ PUnit a) => [a] -> a -> aSource

Stack pictures centered ontop of each other - the first picture in the list is drawn at the top, last picture is on drawn at the bottom.

hspace :: (Num u, Composite a, Horizontal a, Blank a, u ~ PUnit a) => u -> a -> a -> aSource

hspace n a b

Concatenate the pictures `a`

and `b`

with `(->-)`

- injecting
a space of `n`

units to separate the pictures.

vspace :: (Num u, Composite a, Vertical a, Blank a, u ~ PUnit a) => u -> a -> a -> aSource

vspace n a b

Concatenate the pictures `a`

and `b`

with `(-//-)`

- injecting
a space of `n`

units to separate the pictures.

hsep :: (Num u, Composite a, Horizontal a, Blank a, u ~ PUnit a) => u -> a -> [a] -> aSource

hsep n x xs

Concatenate the list of pictures `xs`

horizontally with
`hspace`

starting at `x`

. The pictures are interspersed with
spaces of `n`

units.

vsep :: (Num u, Composite a, Vertical a, Blank a, u ~ PUnit a) => u -> a -> [a] -> aSource

vsep n x xs

Concatenate the list of pictures `xs`

vertically with
`vspace`

starting at `x`

. The pictures are interspersed with
spaces of `n`

units.

# Compose with alignment

alignH :: (Fractional u, Composite a, Horizontal a, Vertical a, Move a, u ~ PUnit a) => HAlign -> a -> a -> aSource

alignH z a b

Move picture `b`

up or down to be horizontally aligned along a
line from the top, center or bottom of picture `a`

alignV :: (Fractional u, Composite a, Horizontal a, Vertical a, Move a, u ~ PUnit a) => VAlign -> a -> a -> aSource

alignV z a b

Move picture `b`

left or right to be vertically aligned along a
line from the left side, center or right side of picture `a`

hcatA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, u ~ PUnit a) => HAlign -> a -> [a] -> aSource

Variant of `hcat`

that aligns the pictures as well as
concatenating them.

vcatA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, u ~ PUnit a) => VAlign -> a -> [a] -> aSource

Variant of `vcat`

that aligns the pictures as well as
concatenating them.

hsepA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, Blank a, u ~ PUnit a) => HAlign -> u -> a -> [a] -> aSource

Variant of `hsep`

that aligns the pictures as well as
concatenating and spacing them.

vsepA :: (Fractional u, Horizontal a, Vertical a, Composite a, Move a, Blank a, u ~ PUnit a) => VAlign -> u -> a -> [a] -> aSource

Variant of `vsep`

that aligns the pictures as well as
concatenating and spacing them.

# Special function for text

multilabel :: (Fractional u, Floating u, Ord u, TextLabel t) => t -> u -> VAlign -> [String] -> Point2 u -> Picture uSource

Create multiple lines of text.

The dimension argument is the linespacing, measured as the distance between the upper lines descender and the lower lines ascender.

An error is throw if the list of strings is empty