diagrams- An EDSL for creating simple diagrams





Type definitions and convenience functions for Graphics.Rendering.Diagrams, an embedded domain-specific language (EDSL) for creating simple diagrams.


Primitive types

data Diagram Source

Diagram is the core data type which describes a diagram. Diagrams may be constructed, transformed, combined, and ultimately rendered as an image.



The empty diagram

Prim Shape

A primitive shape

Ann Attr Diagram

An annotated diagram

Compound Layout

A compound diagram

Union [Diagram]

A fully processed compound diagram, ready for rendering

Sized Point Diagram

An explicitly sized diagram whose bounding box takes up a particular amount of space.

class Color c whereSource

The Color type class encompasses color representations which can be used by the Diagrams library; that is, every function in the Diagrams library which expects a color can take any type which is an instance of Color. Instances are provided for both the Colour and AlphaColour types from the Data.Colour library.


data SomeColor Source

Existential wrapper for instances of the Color class.


forall c . Color c => SomeColor c 


type Point = (Double, Double)Source

Basic 2D points/vectors.

(*.) :: Double -> Point -> PointSource

Scalar multiplication.

(.-.) :: Point -> Point -> PointSource

Elementwise addition, subtraction and multiplication for Points.

data Path Source

A path is a series of edges which can be stroked, filled, etc. It can be either open (the default) or closed (i.e. the first and last vertices are connected).


Path PathType [Vec] 


data PathType Source

A path can be open (normal) or closed (first and last vertices connected automatically).



data PathStyle Source

The styles in which a path can be rendered.


Bezier Double 

Shapes, attributes, and layouts

class ShapeClass s whereSource

The primitive shapes which can be used to build up a diagram. Every primitive shape must be an instance of ShapeClass.

Given a shape s, if shapeSize s evaluates to (w,h), then the drawing rendered by renderShape s should fit within a w by h rectangle centered at the origin.

You can create your own shape primitives by creating a new data type and making it an instance of ShapeClass. If you do so, you must be sure that your ShapeClass instance satisfies the law described above, on which the rendering engine relies in order to compute the proper positions for objects in a diagram. Otherwise, instances of your object in a diagram may extend outside the boundaries of the rendered image, or inadvertently overlap or be overlapped by other diagram elements. Of course, you are free to ignore this "law" as well; it will cause unexpected output at worst, and at best you may find some clever way to bend the system to your will. =)


shapeSize :: s -> PointSource

Calculate the size (the dimensions of a bounding box centered at the origin) of a shape.

renderShape :: s -> DiaRenderM ()Source

Calculate a cairo Render action to render a shape.


ShapeClass RawCairo 
ShapeClass Text 
ShapeClass RoundRect 
ShapeClass PathShape 
ShapeClass Arc 

data Shape Source

Existential wrapper type for shapes.


forall s . ShapeClass s => Shape s 

class AttrClass a whereSource

Attributes which can be applied as annotations to a Diagram, and change the way the Diagram is interpreted or rendered. Every attribute must be an instance of AttrClass.


attrSize :: a -> Point -> PointSource

Given an attribute and the size of the diagram to which it is an annotation, return a new size for the diagram. The default implementation is to simply return the size unchanged.

renderAttr :: a -> DiaRenderM (DiaRenderEnv -> DiaRenderEnv)Source

In order to implement this attribute, renderAttr may perform an action in the DiaRenderM monad, and return a function which produces a local modification to the render environment. The change produced by this function will only remain in effect for any sub-diagrams, and the environment will return to its former state afterwards.


AttrClass Dashing 
AttrClass LJoin 
AttrClass LCap 
AttrClass Scale 
AttrClass Translate 
AttrClass Rotate 
AttrClass Typeface 
AttrClass StrokeWidth 
AttrClass Stroke 
AttrClass Fill 

data Attr Source

Existential wrapper type for attributes.


forall a . AttrClass a => Attr a 

class Functor f => LayoutClass l f whereSource

All layouts must be instances of LayoutClass, along with an appropriate container type which must be an instance of Functor.


layoutSizeAndPos :: l -> f (Point, Diagram) -> (Point, [Diagram])Source

Given a layout and a container of (size, diagram) pairs (which have already had all subdiagrams appropriately positioned), compute the overall bounding box size for this layout, as well as a list of positioned subdiagrams.


LayoutClass FromSize Identity 
LayoutClass ShowBBox Identity 
LayoutClass Padded Identity 
LayoutClass Positioned [] 
LayoutClass List [] 
LayoutClass UnionLayout [] 

data Layout Source

An existential wrapper type for layouts. A layout consists of a (possibly parameterized) layout type, along with a container of Diagrams.


forall l f . LayoutClass l f => Layout l (f Diagram) 


data DiaRenderEnv Source

An environment containing additional parameters to be made available while rendering, which for one reason or another are not or cannot be provided by the cairo Render monad itself. For example, cairo only tracks one current color, so we must track a fill color and stroke color separately.

defaultDiaRenderEnv :: DiaRenderEnvSource

The default rendering environment: transparent fill with 1-pixel black strokes.

newtype DiaRenderM a Source

The custom rendering monad: ReaderT DiaRenderEnv on top of cairo's Render monad.


DRM (ReaderT DiaRenderEnv Render a) 

runDiaRenderM :: DiaRenderM a -> DiaRenderEnv -> Render aSource

Run a DiaRenderM action, given an initial rendering environment, to produce a cairo Render action.

c :: Render a -> DiaRenderM aSource

Lift a cairo Render action into a DiaRenderM action.

data SizeSpec Source

A specification of the size of a rendered Diagram.


Width Double

an explicit width; the height is determined automatically

Height Double

an explicit height; the width is determined automatically


determine the size automatically (do not scale)

data OutputType Source

The supported output file types for rendered diagrams.