Nodes

1.0.0

🌲🌿🌳 Nodes is a class protocol for tree data structures with multiple children. Written in Swift.
Cosmo/Nodes

What's New

First Release! πŸŽ‰

2019-11-01T03:18:51Z

Nodes

Nodes is a class protocol for tree data structures. A class which conforms the Node-Protocol, will gain useful properties to easily navigate in the tree.

Usage

Create a new class and conform it to the Node-Protocol:

final class SimpleNode: Node {
    typealias Value = String
    var value: Value
    weak var parent: SimpleNode?
    var children: [SimpleNode]
    
    init(value: Value) {
        self.value = value
        self.children = []
    }
}

extension SimpleNode: Equatable, CustomStringConvertible {
    static func == (lhs: SimpleNode, rhs: SimpleNode) -> Bool {
        return lhs.value == rhs.value && lhs.parent == rhs.parent
    }

    public var description: String {
        return "\(value)"
    }
}

Create a root node:

let root = SimpleNode(value: "Hand")

Add children with addChild(node: Node):

root.addChild(node: SimpleNode(value: "Thumb"))
root.addChild(node: SimpleNode(value: "Index finger"))
root.addChild(node: SimpleNode(value: "Middle finger"))
root.addChild(node: SimpleNode(value: "Ring finger"))
root.addChild(node: SimpleNode(value: "Little finger"))

Print tree to console:

print(root.lineBasedDescription)

Result:

Hand
β”œβ”€β”€ Thumb
β”œβ”€β”€ Index finger
β”œβ”€β”€ Middle finger
β”œβ”€β”€ Ring finger
└── Little finger

Features

Ancestors

/// Returns all parent nodes.
var ancestors: [Node]
/// Returns all parent nodes, including the current node.
var ancestorsIncludingSelf: [Node]
/// A Boolean value indicating whether the current node is the top node.
var isRoot: Bool
/// Returns the top node.
var root: Node

Descendants

/// Adds a sub-node.
func addChild(node: Node)
/// Returns the number of children.
var degree: Int
/// Returns all descendants, traversing the entire tree.
var descendants: [Node]

Leaves

/// A Boolean value indicating whether the node is without children.
var isLeaf: Bool
/// Returns all nodes with no children.
var leaves: [Node]
/// Returns the number of leaves.
var breadth: Int

Branches

/// A Boolean value indicating whether the node has children.
var isBranch: Bool
/// Returns all nodes with at least one child.
var branches: [Node]

Siblings

/// Returns all other nodes with the same parent.
var siblings: [Node]
/// Returns all nodes (including the current node) with the same parent.
var siblingsIncludingSelf: [Node]

Position

/// Returns the distance between a node and the root.
var depth: Int
/// The number of edges between the current node and the root.
var level: Int

Textual representation

var lineBasedDescription: String

Example

let root = SimpleNode(value: "Apple")

let desktops = SimpleNode(value: "Desktops")
root.addChild(node: desktops)

let macPro = SimpleNode(value: "Mac Pro")
desktops.addChild(node: macPro)

let macMini = SimpleNode(value: "Mac Mini")
desktops.addChild(node: macMini)

let iMac = SimpleNode(value: "iMac")
desktops.addChild(node: iMac)

let notebooks = SimpleNode(value: "Notebooks")
root.addChild(node: notebooks)

let macBookPro = SimpleNode(value: "MacBook Pro")
notebooks.addChild(node: macBookPro)

let devices = SimpleNode(value: "Devices")
root.addChild(node: devices)

let handhelds = SimpleNode(value: "Handhelds")
devices.addChild(node: handhelds)

let ipod = SimpleNode(value: "iPod")
handhelds.addChild(node: ipod)

let iphone = SimpleNode(value: "iPhone")
handhelds.addChild(node: iphone)

let newton = SimpleNode(value: "Newton")
handhelds.addChild(node: newton)

let setTopBoxes = SimpleNode(value: "Set-top boxes")
devices.addChild(node: setTopBoxes)

let appleTV = SimpleNode(value: "Apple TV")
setTopBoxes.addChild(node: appleTV)


print(root.lineBasedDescription)

Output:

Apple
β”œβ”€β”€ Desktops
β”‚   β”œβ”€β”€ Mac Pro
β”‚   β”œβ”€β”€ Mac Mini
β”‚   └── iMac
β”œβ”€β”€ Notebooks
β”‚   └── MacBook Pro
└── Devices
    β”œβ”€β”€ Handhelds
    β”‚   β”œβ”€β”€ iPod
    β”‚   β”œβ”€β”€ iPhone
    β”‚   └── Newton
    └── Set-top boxes
        └── Apple TV

Other Projects

  • BinaryKit β€” BinaryKit helps you to break down binary data into bits and bytes and easily access specific parts.
  • Clippy β€” Clippy from Microsoft Office is back and runs on macOS! Written in Swift.
  • GrammaticalNumber β€” Turns singular words to the plural and vice-versa in Swift.
  • HackMan β€” Stop writing boilerplate code yourself. Let hackman do it for you via the command line.
  • ISO8859 β€” Convert ISO8859 1-16 Encoded Text to String in Swift. Supports iOS, tvOS, watchOS and macOS.
  • SpriteMap β€” SpriteMap helps you to extract sprites out of a sprite map. Written in Swift.
  • StringCase β€” Converts String to lowerCamelCase, UpperCamelCase and snake_case. Tested and written in Swift.
  • TinyConsole β€” TinyConsole is a micro-console that can help you log and display information inside an iOS application, where having a connection to a development computer is not possible.

License

Nodes is released under the MIT License.

Description

  • Swift Tools 5.1.0
View More Packages from this Author

Dependencies

  • None
Last updated: Fri Apr 12 2024 14:29:32 GMT-0900 (Hawaii-Aleutian Daylight Time)