aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: eefb8d76275f5d2585236e74656541fcf43dedd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# wmap-parser-swift

A parser for `wmap` formatted Wardley Map files built in Swift.

## Features

* No dependencies.
* Free software.
* Reasonably fast.

## Installation

Add it to your project using Swift Package Manager by adding the following to your `Package.swift`:

```swift
dependencies: [
    .package(url: "https://git.sr.ht/~rbdr/wmap-parser-swift", from: "1.0.0")
]
```

Or add it directly in Xcode using File > Add Packages...

## Usage

```swift
import WmapParser

let wmapSource = """
[I] 0.25
[II] 0.5
[III] 0.75
[IV] 1.0

Tea (0.9, 0.5) [Circle]
Cup (0.8, 0.4)
Hot Water (0.6, 0.2)

Tea -> Cup
Cup -> Hot Water

[Note] (0.5, 0.5) Supply chain for tea
[Group] Tea, Cup
[Inertia] Cup
[Evolution] Tea + 0.1
"""

let map = parse(wmapSource)

print(map.components)
// [
//   Component(label: "Tea", coordinates: (0.9, 0.5), shape: .circle),
//   Component(label: "Cup", coordinates: (0.8, 0.4), shape: .circle),
//   ...
// ]

print(map.dependencies)
// [
//   Dependency(from: "Tea", to: "Cup", isDirected: true),
//   ...
// ]
```

## API

### `parse(_ source: String) -> Map`

Parses a wmap formatted string and returns a Map object.

**Parameters:**

- `source` (String): The wmap source code to parse

**Returns:**

- `Map`: A Map struct containing the parsed components, dependencies, notes,
    stages, groups, inertias, and evolutions

## Format Specification

See [The map website](https://map.tranquil.systems) for more information on the
format.

## Reasonably Fast

Benchmarked on an M1 Pro mac. A map with around 120 entities parses in 14µs.
While a larger map with slightly under 2000 entities does so in 230µs.

You can run the benchmarks by using:

```bash
make benchmark
```

## Development

This project uses a Makefile to run all commands. This is to keep the
commands uniform with the other wmap-parser projects.

### Running Tests

```bash
make test
```

Or to see coverage

```bash
make coverage
```

## See Also

- [wmap specification](doc/wmap-spec.ebnf) - Formal grammar
- [wmap specification](https://git.sr.ht/~rbdr/wmap-parser-js) - Javascript wmap-parser
- [wmap specification](https://git.sr.ht/~rbdr/wmap-parser-c) - ANSI C wmap-parser
- [wmap specification](https://git.sr.ht/~rbdr/wmap-parser-rust) - Rust wmap-parser
- [Wardley Maps](https://wardleymaps.com/) - Learn about Wardley Mapping