# Diagrams/Migrate0.5

This page describes API changes between diagrams 0.4 and 0.5, along with explanations of how to migrate to the new 0.5 API.

## Contents

## R2 and P2 are now abstract

The biggest change to the API between versions 0.4 and 0.5 is that the `R2`

and `P2`

types (representing 2D vectors and points, respectively) are now abstract. `R2`

used to be a synonym for `(Double, Double)`

but this is no longer the case. Also, the constructor `P`

for points is no longer exported.

You can use the functions

r2 :: (Double, Double) -> R2 unr2 :: R2 -> (Double, Double) p2 :: (Double, Double) -> P2 unp2 :: P2 -> (Double, Double)

to convert between pairs of `Double`

s and vectors or points. For example, if you had

beside (4,2) d1 d2

change it to

beside (r2 (4,2)) d1 d2

If you had

fromOffsets [(2,1), (3,5), (2,0)]

change it to

fromOffsets . map r2 $ [(2,1), (3,5), (2,0)]

Note you can still use `unitX, unitY, unit_X, unit_Y :: R2`

.

If you had some code pattern-matching on vectors or points, the `ViewPatterns`

extension comes in handy: change

foo :: R2 -> ... foo (x,y) = ... x ... y ... bar :: P2 -> ... bar (P (x,y)) = ... x ... y ...

to

{-# LANGUAGE ViewPatterns #-} foo :: R2 -> ... foo (unr2 -> (x,y)) = ... x ... y ... bar :: P2 -> ... bar (unp2 -> (x,y)) = ... x ... y ...

To convert a vector `v`

to a point, use `origin .+^ v`

. To convert a point `p`

to a vector, use `p .-. origin`

.

## roundedRect

The `roundedRect`

function now takes two `Double`

arguments instead of an `R2`

argument, to be more consistent with `rect`

. If you had something like `roundedRect (2,3) 0.2`

, just change it to `roundedRect 2 3 0.2`

.

## circlePath

The `circlePath`

function has been removed; you should be able to simply replace it with `circle`

.

## Semantics of beside

The semantics of `beside`

---and hence also of `(|||)`

and `(===)`

, which are implemented in terms of beside---is now different. In particular, the local origin of `beside v d1 d2`

is now the local origin of `d1`

rather than the point of tangency between `d1`

and `d2`

. This has several advantages, namely

`beside v`

,`(|||)`

, and`(===)`

are now associative- The new semantics is more consistent with the semantics of
`cat`

.

If you want the old behavior, simply perform an alignment on the first diagram before combining. That is, replace `beside v d1 d2`

by `beside v (align v d1) d2`

. If `d1`

and `d2`

are the same width the same effect can be achieved by first combining and then centering.

## AnnDiagram renamed QDiagram

This change was made to be consistent with referring to the monoidal parameter as a "query" rather than an "annotation". Simply change `AnnDiagram`

to `QDiagram`

everywhere it occurs.

## Additional Semigroup constraints

In some places diagrams now requires a `Semigroup`

constraint in addition to `Monoid`

(ideally `Monoid`

would have `Semigroup`

as a superclass...). If you get an error about "could not deduce `Semigroup`

constraint" you probably just need to add one.