fp-ts-graph
Immutable, functional graph data structure for fp-ts.
The graph is directed and cyclic.
Install
npm install fp-ts @no-day/fp-ts-graph
Docs
API
Examples
Define Types
import { Graph } from "fp-ts-graph";
export type MyId = number;
export type MyNode = { firstName: string; lastName: string; age: number };
export type MyEdge = { items: number[] };
export type MyGraph = Graph<MyId, MyEdge, MyNode>;
Build Graph
import * as graph from "fp-ts-graph";
import { Graph } from "fp-ts-graph";
import { Option } from "fp-ts/Option";
import * as option from "fp-ts/Option";
import { pipe } from "fp-ts/function";
import { eqNumber } from "fp-ts/lib/Eq";
import { MyEdge, MyId, MyNode } from "./types";
type MyGraph = Graph<MyId, MyEdge, MyNode>;
const empty = graph.empty<MyId, MyEdge, MyNode>();
const insertNode = graph.insertNode(eqNumber);
const insertEdge = graph.insertEdge(eqNumber);
export const myGraph: Option<MyGraph> = pipe(
empty,
insertNode(1001, {
firstName: "Tonicha",
lastName: "Crowther",
age: 45,
}),
insertNode(1002, {
firstName: "Samual",
lastName: "Sierra",
age: 29,
}),
insertNode(1003, {
firstName: "Khushi",
lastName: "Walter",
age: 40,
}),
insertNode(1004, {
firstName: "Rian",
lastName: "Ruiz",
age: 56,
}),
option.of,
option.chain(insertEdge(1001, 1002, { items: [2, 3] })),
option.chain(insertEdge(1002, 1003, { items: [4] })),
option.chain(insertEdge(1001, 1003, { items: [9, 4, 3] })),
option.chain(insertEdge(1003, 1004, { items: [2, 3] }))
);
Debug graph visually
import * as graph from "fp-ts-graph";
import * as option from "fp-ts/Option";
import { flow, pipe } from "fp-ts/function";
import { myGraph } from "./build-graph";
pipe(
myGraph,
option.map(
flow(
graph.mapEdges(({ items }) => items.join(", ")),
graph.map(
({ firstName, lastName, age }) => `${lastName}, ${firstName} (${age})`
),
graph.toDotFile(_ => _.toString())
)
),
option.fold(
() => console.error("invalid graph!"),
console.log
)
);
If you have graphviz installed you can run the following in the terminal:
ts-node examples/debug-visually.ts | dot -Tsvg > graph.svg
chromium graph.svg