Class: Rambling::Trie::Nodes::Node

Inherits:
Object
  • Object
show all
Includes:
Comparable, Compressible, Enumerable, Inspectable, Stringifyable
Defined in:
lib/rambling/trie/nodes/node.rb

Overview

A representation of a node in the trie data structure.

Direct Known Subclasses

Compressed, Missing, Raw

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Inspectable

#inspect

Methods included from Stringifyable

#as_word, #to_s

Methods included from Comparable

#==

Methods included from Enumerable

#each

Methods included from Compressible

#compressible?

Constructor Details

#initialize(letter = nil, parent = nil, children_tree = {}) ⇒ Node

Creates a new node.

Parameters:

  • letter (Symbol, nil) (defaults to: nil)

    the Node’s letter value.

  • parent (Node, nil) (defaults to: nil)

    the parent of the current node.



35
36
37
38
39
# File 'lib/rambling/trie/nodes/node.rb', line 35

def initialize letter = nil, parent = nil, children_tree = {}
  @letter = letter
  @parent = parent
  @children_tree = children_tree
end

Instance Attribute Details

#children_treeHash<Symbol, Node>

Child nodes tree.

Returns:

  • (Hash<Symbol, Node>)

    the children tree hash, consisting of :letter => node.



26
27
28
# File 'lib/rambling/trie/nodes/node.rb', line 26

def children_tree
  @children_tree
end

#letterSymbol? #letter=(letter) ⇒ Symbol?

Returns the corresponding letter(s).

Overloads:

  • #letterSymbol?

    Letter(s) corresponding to the current node.

  • #letter=(letter) ⇒ Symbol?

    Sets the letter(s) corresponding to the current node. Ensures the #letter in the #parent‘s #children_tree is updated.

    Parameters:

    • letter (String, Symbol, nil)

      the letter value.

Returns:

  • (Symbol, nil)

    the corresponding letter(s).



22
23
24
# File 'lib/rambling/trie/nodes/node.rb', line 22

def letter
  @letter
end

#parentNode?

Parent node.

Returns:

  • (Node, nil)

    the parent of the current node.



30
31
32
# File 'lib/rambling/trie/nodes/node.rb', line 30

def parent
  @parent
end

Instance Method Details

#[](letter) ⇒ Node

Get Node corresponding to a given letter.

Parameters:

  • letter (Symbol)

    the letter to search for in the node.

Returns:

  • (Node)

    the node corresponding to that letter.

See Also:



126
127
128
# File 'lib/rambling/trie/nodes/node.rb', line 126

def [] letter
  children_tree[letter]
end

#[]=(letter, node) ⇒ Node

Set the Node that corresponds to a given letter.

Parameters:

  • letter (Symbol)

    the letter to insert or update in the node’s

  • node (Node)

    the Node to assign to that letter.

Returns:

  • (Node)

    the node corresponding to the inserted or updated letter.

See Also:



135
136
137
# File 'lib/rambling/trie/nodes/node.rb', line 135

def []= letter, node
  children_tree[letter] = node
end

#childrenArray<Node>

Child nodes.

Returns:

  • (Array<Node>)

    the array of child nodes contained in the current node.



43
44
45
# File 'lib/rambling/trie/nodes/node.rb', line 43

def children
  children_tree.values
end

#delete(letter) ⇒ Node

Delete a given letter and its corresponding Node from this Node‘s children tree.

Parameters:

  • letter (Symbol)

    the letter to delete from the node’s children tree.

Returns:

  • (Node)

    the node corresponding to the deleted letter.

See Also:



152
153
154
# File 'lib/rambling/trie/nodes/node.rb', line 152

def delete letter
  children_tree.delete letter
end

#first_childNode?

First child node.

Returns:

  • (Node, nil)

    the first child contained in the current node.



49
50
51
52
53
54
55
# File 'lib/rambling/trie/nodes/node.rb', line 49

def first_child
  return if children_tree.empty?

  # rubocop:disable Lint/UnreachableLoop
  children_tree.each_value { |child| return child }
  # rubocop:enable Lint/UnreachableLoop
end

#key?(letter) ⇒ Boolean Also known as: has_key?

Check if a Node‘s children tree contains a given letter.

Parameters:

  • letter (Symbol)

    the letter to search for in the node.

Returns:

  • (Boolean)

    true if the letter is present, false otherwise.

See Also:



143
144
145
# File 'lib/rambling/trie/nodes/node.rb', line 143

def key? letter
  children_tree.key? letter
end

#match_prefix(chars) {|String| ... } ⇒ Enumerator<String>

Returns all words that match a prefix of any length within chars.

Parameters:

  • chars (String)

    the chars to base the prefix on.

Yields:

  • (String)

    each word found.

Returns:

  • (Enumerator<String>)

    all the words that match a prefix by chars.



112
113
114
115
116
117
118
119
120
# File 'lib/rambling/trie/nodes/node.rb', line 112

def match_prefix chars
  return enum_for :match_prefix, chars unless block_given?

  yield as_word if terminal?

  children_match_prefix chars do |word|
    yield word
  end
end

#partial_word?(chars) ⇒ Boolean

Checks if a path for a set of characters exists in the trie.

Parameters:

  • chars (Array<String>)

    the characters to look for in the trie.

Returns:

  • (Boolean)

    true if the characters are found, false otherwise.



83
84
85
86
87
# File 'lib/rambling/trie/nodes/node.rb', line 83

def partial_word? chars
  return true if chars.empty?

  partial_word_chars? chars
end

#root?Boolean

Indicates if the current node is the root node.

Returns:

  • (Boolean)

    true if the node does not have a parent, false otherwise.



59
60
61
# File 'lib/rambling/trie/nodes/node.rb', line 59

def root?
  !parent
end

#scan(chars) ⇒ Node

Returns the node that starts with the specified characters.

Parameters:

  • chars (Array<String>)

    the characters to look for in the trie.

Returns:

  • (Node)

    the node that matches the specified characters. Missing when not found.



102
103
104
105
106
# File 'lib/rambling/trie/nodes/node.rb', line 102

def scan chars
  return self if chars.empty?

  closest_node chars
end

#terminal!self

Mark Node as terminal.

Returns:

  • (self)

    the modified node.



71
72
73
74
# File 'lib/rambling/trie/nodes/node.rb', line 71

def terminal!
  self.terminal = true
  self
end

#terminal?Boolean

Indicates if a Node is terminal or not.

Returns:

  • (Boolean)

    true for terminal nodes, false otherwise.



65
66
67
# File 'lib/rambling/trie/nodes/node.rb', line 65

def terminal?
  !!terminal
end

#word?(chars = []) ⇒ Boolean

Checks if a path for set of characters represents a word in the trie.

Parameters:

  • chars (Array<String>) (defaults to: [])

    the characters to look for in the trie.

Returns:

  • (Boolean)

    true if the characters are found and form a word, false otherwise.



92
93
94
95
96
# File 'lib/rambling/trie/nodes/node.rb', line 92

def word? chars = []
  return terminal? if chars.empty?

  word_chars? chars
end