dagger

package module
v0.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 24, 2020 License: Apache-2.0 Imports: 1 Imported by: 5

README

dagger GoDoc

dagger is a blazing fast, concurrency safe, mutable, in-memory directed graph implementation with zero dependencies

import "github.com/autom8ter/dagger"

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Close

func Close()

func EdgeTypes

func EdgeTypes() []string

func HasNode

func HasNode(id primitive.TypedID) bool

func NodeTypes

func NodeTypes() []string

func RangeEdgeTypes

func RangeEdgeTypes(edgeType primitive.Type, fn func(e *primitive.Edge) bool)

func RangeEdges

func RangeEdges(fn func(e *primitive.Edge) bool)

func RangeNodeTypes

func RangeNodeTypes(typ primitive.Type, fn func(n *Node) bool)

func RangeNodes

func RangeNodes(fn func(n *Node) bool)

Types

type Node

type Node struct {
	primitive.TypedID
}

func GetNode

func GetNode(id primitive.TypedID) (*Node, bool)

func NewNode

func NewNode(nodeType, id string, attributes map[string]interface{}) *Node
Example
package main

import (
	"fmt"
	"github.com/autom8ter/dagger"
	"github.com/autom8ter/dagger/primitive"
	"log"
	"time"
)

func main() {
	coleman = dagger.NewNode("user", fmt.Sprintf("cword_%v", time.Now().UnixNano()), map[string]interface{}{
		"name": "coleman",
	})
	tyler = dagger.NewNode("user", fmt.Sprintf("twash_%v", time.Now().UnixNano()), map[string]interface{}{
		"name": "tyler",
	})
	sarah = dagger.NewNode("user", fmt.Sprintf("swash_%v", time.Now().UnixNano()), map[string]interface{}{
		"name": "sarah",
	})
	lacee = dagger.NewNode("user", fmt.Sprintf("ljans_%v", time.Now().UnixNano()), map[string]interface{}{
		"name": "lacee",
	})
	// random id will be generated if one isn't provided
	charlie = dagger.NewNode("dog", "", map[string]interface{}{
		"name":   "charlie",
		"weight": 25,
	})

	if err := coleman.Connect(tyler, "friend"); err != nil {
		exitErr(err)
	}
	if err := tyler.Connect(coleman, "friend"); err != nil {
		exitErr(err)
	}
	if err := sarah.Connect(lacee, "friend"); err != nil {
		exitErr(err)
	}
	if err := lacee.Connect(sarah, "friend"); err != nil {
		exitErr(err)
	}
	if err := coleman.Connect(lacee, "fiance"); err != nil {
		exitErr(err)
	}
	if err := lacee.Connect(coleman, "fiance"); err != nil {
		exitErr(err)
	}
	if err := tyler.Connect(lacee, "wife"); err != nil {
		exitErr(err)
	}
	if err := sarah.Connect(tyler, "wife"); err != nil {
		exitErr(err)
	}
	if err := coleman.Connect(charlie, "pet"); err != nil {
		exitErr(err)
	}
	if err := lacee.Connect(charlie, "pet"); err != nil {
		exitErr(err)
	}
	if err := charlie.Connect(lacee, "owner"); err != nil {
		exitErr(err)
	}
	if err := charlie.Connect(coleman, "owner"); err != nil {
		exitErr(err)
	}
	charlie.Patch(map[string]interface{}{
		"weight": 19,
	})
	// check to make sure edge is patched
	coleman.EdgesFrom(func(e *primitive.Edge) bool {
		if e.Type() == "pet" && e.GetString("name") == "charlie" {
			if e.To.GetInt("weight") != 19 {
				exit("failed to patch charlie's weight")
			}
		}
		return true
	})
	// remove from graph
	charlie.Remove()
	// no longer in graph
	if dagger.HasNode(charlie) {
		exit("failed to delete node - (charlie)")
	}
	// check to make sure edge no longer exists(cascade)
	coleman.EdgesFrom(func(e *primitive.Edge) bool {
		if e.Type() == "pet" && e.GetString("name") == "charlie" {
			exit("failed to delete node - (charlie)")
		}
		return true
	})
	// check to make sure edge no longer exists(cascade)
	lacee.EdgesFrom(func(e *primitive.Edge) bool {
		if e.Type() == "pet" && e.GetString("name") == "charlie" {
			exit("failed to delete node - (charlie)")
		}
		return true
	})
}

func exit(msg string) {
	log.Fatal(msg)
}

func exitErr(err error) {
	log.Fatal(err)
}

func (*Node) Connect

func (n *Node) Connect(node *Node, relationship string) error

func (*Node) EdgesFrom

func (n *Node) EdgesFrom(fn func(e *primitive.Edge) bool)

func (*Node) EdgesTo

func (n *Node) EdgesTo(fn func(e *primitive.Edge) bool)

func (*Node) JSON

func (n *Node) JSON() ([]byte, error)

func (*Node) Patch

func (n *Node) Patch(data map[string]interface{})

func (*Node) Range

func (n *Node) Range(fn func(key string, value interface{}) bool)

func (*Node) Remove

func (n *Node) Remove()

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL