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.

- 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
- 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

# 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`

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.