From HaskellWiki
< Diagrams‎ | Dev
Revision as of 09:54, 28 March 2015 by Cchalmers (talk | contribs) (Created page with "This page describes breaking API changes between diagrams 1.2 and 1.3, along with explanations of how to migrate to the new 1.2 API. == Linear == The linear algebra package ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

This page describes breaking API changes between diagrams 1.2 and 1.3, along with explanations of how to migrate to the new 1.2 API.


The linear algebra package has moved from vector-space to linear.

The most obvious difference is there are now two type variables for the vector space: v, which gives the space being worked in and n, the number type used. v now has kind * -> *, which means is takes some type (usually n) and makes a concrete vector. Basically this means whenever you saw v, replace it by v n. So:

  • R2 -> V2 Double
  • Point R2 -> Point V2 Double
  • Path R2 -> Path V2 Double
  • QDiagram b v m -> QDiagram b v n m

The Diagram alias has also changed. Now it uses the default space and number type for some backend:

Diagram b = QDiagram b (V b) (N b) Any

where V b is the default space and N b is the default number type for backend b.

linear’s functions are very similar to vector-space. The biggest difference is lerp which is defined as

lerp alpha u v = alpha *^ u ^+^ (1 - alpha) *^ v

This is the opposite way round to vector-space’s lerp.

The old HasX, HasY and HasZ classes have been replaced by linear’s R1, R2 and R3.

Direction type

A new Direction type has been added to Diagrams.Direction. A Direction is a vector that has forgot its magnitude. Certain functions include arc, reflectAcross have had their types moved from V2 Double to Direction Double to make it clear the magnitude has no impact.

arc now takes a starting direction and an angle. arcCW and arcCCW give a clockwise or counter clockwise arc between two directions.

angleBetween is commutative (and always positive).

Measure changes

The internal representation of Measure has now changed. The old constructor cannot be used anymore. Instead the have been replaced by:

  • Normalized -> normalized or normalised
  • Local -> local
  • Global -> global
  • Output -> output


SizeSpec2D is now SizeSpec V2 Double and has moved to Diagrams.Size. The resizing functions now work for any vector space. The constructors have been replaced with the following functions:

  • Dims -> dims
  • Width -> mkWidth
  • Height -> mkHeight
  • Absolute -> absolute

mkWidth and mkHeight are in Diagrams.TwoD.Size.


The qualify with name operator (|>) has moved to (.>>) to make room for lenses snoc operator (|>) (which now works on Lines).

ToPath class

A new ToPath class has been added. It takes path-like things (like lines, loops, trails, paths) and converts them to a Path.

This is very different from the TrailLike class, which is polymorphic in it’s result. Because both these classes are polymorphic, you can’t produce something with the TrailLike class and consume it with ToPath without specifying the type inbetween.

Because stroke now uses this class it can cause some ambiguity error for old code. The old (less polymorphic) stroke has moved to strokePath (or strokeP).

New features

Segment intersections have been added to Diagrams.TwoD.Segment. Functions for intersection points of path-like things are in Diagrams.TwoD.Path.

There’s a function for finding the convex hull for a list of 2D points in Diagrams.TwoD.Points.

Affine maps have been added to Diagrams.AffineMap that can map between spaces. The Deformable class has also been generalised to map between spaces. Helper functions have been added to Diagrams.ThreeD.Projection for basic orthographic and perspective projections. These can’t be used on a Diagram yet be can be used on path-like things.

Some extra functions have been added to Diagrams.Model to help visualise the Trace and Envelope of a diagram.


  • LineWidth and Dashing has moved back to Diagrams.Attributes.
  • There is no longer a Diagrams.Prelude.ThreeD. Instead all functions are exported by Diagrams.Prelude and functions have had their types generalised to the R1, R2 and R3 classes.
  • Control.Lens and Data.Default are now exported from Diagrams.Prelude. Some names from Control.Lens where hidden.
  • A new Diagrams module now only exports functions defined in the diagrams library.
  • Diagrams.TwoD.Transform.ScaleInv has moved to Diagrams.Transform.ScaleInv.