Skip to content

Himenon/path-oriented-data-structure

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
gh-actions
Feb 4, 2024
769004b · Feb 4, 2024

History

20 Commits
Feb 4, 2024
Feb 4, 2024
Feb 4, 2024
Feb 4, 2024
Feb 4, 2024
Feb 4, 2024
Feb 4, 2024
Jan 15, 2021
Jan 17, 2021
May 2, 2021
Feb 4, 2024
Jan 17, 2021
Jan 15, 2021
Feb 4, 2024
Feb 4, 2024
Jan 15, 2021
Feb 4, 2024
Feb 4, 2024

Repository files navigation

@himenon/path-oriented-data-structure

Data structure management library that extends Composite Pattern to Path orientation.

Usage

Basic Usage

import { Operator, Node } from "@himenon/path-oriented-data-structure";

const operator = new Operator("tree");

const NODE_KIND_A = "node_a" as const;
const NODE_KIND_B = "node_b" as const;

operator.set("a", new Node(NODE_KIND_A, "node_a1"));
operator.set("a/b", new Node(NODE_KIND_A, "node_a2"));
operator.set("a/b/c", new Node(NODE_KIND_A, "node_A3"));

operator.set("a", new Node(NODE_KIND_B, "node_b1"));
operator.set("a/b", new Node(NODE_KIND_B, "node_b2"));
operator.set("a/b/c", new Node(NODE_KIND_B, "node_b3"));

operator.getHierarchy(); // Results below
Result: operator.getHierarchy()
{
  "name": ".",
  "children": {
    "node_a:a": {
      "name": "node_a1"
    },
    "tree:a": {
      "name": "a",
      "children": {
        "node_a:b": {
          "name": "node_a2"
        },
        "tree:b": {
          "name": "b",
          "children": {
            "node_a:c": {
              "name": "node_A3"
            },
            "node_b:c": {
              "name": "node_b3"
            }
          }
        },
        "node_b:b": {
          "name": "node_b2"
        }
      }
    },
    "node_b:a": {
      "name": "node_b1"
    }
  }
}

Extended usage of Node

import { Operator, Node } from "@himenon/path-oriented-data-structure";

export type KindOfString = "string";
export type KindOfNumber = "number";
export type Kind = KindOfNumber | KindOfString;

export class StringValueNode extends Node<KindOfString> {
  constructor(name: string, private value: string) {
    super("string", name);
  }
  public getValue(): string {
    return this.value;
  }
  public setValue(value: string): void {
    this.value = value;
  }
}

export class NumberValueNode extends Node<KindOfNumber> {
  constructor(name: string, private value: number) {
    super("number", name);
  }
  public getValue(): number {
    return this.value;
  }
}

export type GetNode<T extends Kind> = T extends KindOfString ? StringValueNode : T extends KindOfNumber ? NumberValueNode : never;

// Type Safe method
export const createGetChildByPaths = (operator: Operator<string>) => <T extends Kind>(path: string, kind: T): GetNode<T> | undefined => {
  return operator.getChildByPaths(path, kind) as GetNode<T> | undefined;
};

const operator = new Operator("tree");

operator.set("a/b", new StringValueNode("stringValue", "hello world"));
operator.set("a/b", new NumberValueNode("numberValue", 123455));

operator.getHierarchy(); // Results below

const getChildByPaths = createGetChildByPaths(operator);

getChildByPaths("a/b", "string"); // ReturnType: StringValueNode | undefined
getChildByPaths("a/b", "number"); // ReturnType: NumberValueNode | undefined
Result: operator.getHierarchy()
{
  "name": ".",
  "children": {
    "tree:a": {
      "name": "a",
      "children": {
        "string:b": {
          "name": "stringValue"
        },
        "number:b": {
          "name": "numberValue"
        }
      }
    }
  }
}

API

Operator

getChildByPaths(path: string, kind: string): Component | undefined

set(path: string, component: Component): void

remove(path: string, kind: string): void

copy(from: string, to: string, kind: string): boolean

move(from: string, to: string, kind: string): boolean

getChildPaths(kind: string): string[]

LICENCE

@himenon/path-oriented-data-structure・MIT

Packages 1

Contributors 3