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. :reek:MissingSafeMethod { exclude: [ terminal! ] } :reek:RepeatedConditional { max_ifs: 3 }

Direct Known Subclasses

Compressed, Missing, Raw

Constant Summary

Constants included from Enumerable

Enumerable::EMPTY_ENUMERATOR

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.

  • children_tree (Hash<Symbol, Node>) (defaults to: {})

    the children tree of the current node.



38
39
40
41
42
# File 'lib/rambling/trie/nodes/node.rb', line 38

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`.



28
29
30
# File 'lib/rambling/trie/nodes/node.rb', line 28

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).



24
25
26
# File 'lib/rambling/trie/nodes/node.rb', line 24

def letter
  @letter
end

#parentNode?

Parent node.

Returns:

  • (Node, nil)

    the parent of the current node.



32
33
34
# File 'lib/rambling/trie/nodes/node.rb', line 32

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:



131
132
133
# File 'lib/rambling/trie/nodes/node.rb', line 131

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:



140
141
142
# File 'lib/rambling/trie/nodes/node.rb', line 140

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.



46
47
48
# File 'lib/rambling/trie/nodes/node.rb', line 46

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, nil)

    the node corresponding to the deleted letter.

See Also:



157
158
159
# File 'lib/rambling/trie/nodes/node.rb', line 157

def delete letter
  children_tree.delete letter
end

#first_childNode?

First child node.

Returns:

  • (Node, nil)

    the first child contained in the current node.



52
53
54
55
56
57
58
59
60
# File 'lib/rambling/trie/nodes/node.rb', line 52

def first_child
  return if children_tree.empty?

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

  nil
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:



148
149
150
# File 'lib/rambling/trie/nodes/node.rb', line 148

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 (Array[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.



117
118
119
120
121
122
123
124
125
# File 'lib/rambling/trie/nodes/node.rb', line 117

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.



88
89
90
91
92
# File 'lib/rambling/trie/nodes/node.rb', line 88

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.



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

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.



107
108
109
110
111
# File 'lib/rambling/trie/nodes/node.rb', line 107

def scan chars
  return self if chars.empty?

  closest_node chars
end

#terminal!self

Mark Node as terminal.

Returns:

  • (self)

    the modified node.



76
77
78
79
# File 'lib/rambling/trie/nodes/node.rb', line 76

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.



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

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.



97
98
99
100
101
# File 'lib/rambling/trie/nodes/node.rb', line 97

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

  word_chars? chars
end