An open API service indexing awesome lists of open source software.

https://github.com/heimdalr/dag

Yet another directed acyclic graph (DAG) implementation in golang.
https://github.com/heimdalr/dag

dag directed-acyclic-graph golang golang-module

Last synced: 3 months ago
JSON representation

Yet another directed acyclic graph (DAG) implementation in golang.

Awesome Lists containing this project

README

          

# dag

[![run tests](https://github.com/heimdalr/dag/workflows/Run%20Tests/badge.svg?branch=master)](https://github.com/heimdalr/dag/actions?query=branch%3Amaster)
[![PkgGoDev](https://pkg.go.dev/badge/github.com/heimdalr/dag)](https://pkg.go.dev/github.com/heimdalr/dag)
[![Go Report Card](https://goreportcard.com/badge/github.com/heimdalr/dag)](https://goreportcard.com/report/github.com/heimdalr/dag)
[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/heimdalr/dag)
[![CodeQL](https://github.com/heimdalr/dag/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/heimdalr/dag/actions/workflows/codeql-analysis.yml)

[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6402/badge)](https://bestpractices.coreinfrastructure.org/projects/6402)

Implementation of directed acyclic graphs (DAGs).

The implementation is fast and thread-safe. It prevents adding cycles or
duplicates and thereby always maintains a valid DAG. The implementation caches
descendants and ancestors to speed up subsequent calls.

## Quickstart

Running:

``` go
package main

import (
"fmt"
"github.com/heimdalr/dag"
)

func main() {

// initialize a new graph
d := NewDAG()

// init three vertices
v1, _ := d.AddVertex(1)
v2, _ := d.AddVertex(2)
v3, _ := d.AddVertex(struct{a string; b string}{a: "foo", b: "bar"})

// add the above vertices and connect them with two edges
_ = d.AddEdge(v1, v2)
_ = d.AddEdge(v1, v3)

// describe the graph
fmt.Print(d.String())
}
```

will result in something like:

```
DAG Vertices: 3 - Edges: 2
Vertices:
1
2
{foo bar}
Edges:
1 -> 2
1 -> {foo bar}
```