# Diagrams/Dev/Migrate1.3

< Diagrams‎ | Dev
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

## SizeSpec

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

## Names

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

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

## Reorganisation

• `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`.