pretree 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/file_writer.rb +19 -0
  3. data/lib/pretree.rb +99 -0
  4. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b12f0c90e7b27da6ade9b14e430c1386d6108b53cac874700e403a4332ff7977
4
+ data.tar.gz: c7c97966a45bc4e0bb37c30f08cd0f6fd442c1a9442d37957e696ba40a3f2430
5
+ SHA512:
6
+ metadata.gz: 84ebe54d5e3767dc4515fddbf8ecf6aa639b79180629e4e896479d753caab296e0c88a51aff0bde7df04d5df61fdb63654f8298062a38795dc94e1998196fd69
7
+ data.tar.gz: f98c580d93eae6909934251c04a87377dff3567eb7b3e04a90b447a8df2923434b90fd2838c0caf6f1a457281d0801d24fec2e80f44a8bee02b2d7a3c88bad46
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+
5
+ class CSVWrite
6
+ def initialize
7
+ @path = '../data.csv'
8
+ end
9
+
10
+ def write(word)
11
+ CSV.open(@path, 'a') do |csv|
12
+ csv << [word]
13
+ end
14
+ end
15
+
16
+ def read
17
+ CSV.read(@path)
18
+ end
19
+ end
data/lib/pretree.rb ADDED
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'file_writer'
4
+
5
+ # Prefix tree (Node class)
6
+ class Node
7
+ attr_reader :value, :next
8
+ attr_accessor :word
9
+
10
+ def initialize(value)
11
+ @value = value
12
+ @word = false
13
+ @next = []
14
+ end
15
+ end
16
+
17
+ # Prefix tree (Trie class)
18
+ class PreTree
19
+ def initialize
20
+ @root = Node.new('root')
21
+ @csv_box = CSVWrite.new
22
+ end
23
+
24
+ def csv_write(word)
25
+ @csv_box.write(word)
26
+ end
27
+
28
+ def csv_read
29
+ @csv_box.read
30
+ end
31
+
32
+ def add_node(character, trie)
33
+ Node.new(character).tap { |new_node| trie << new_node }
34
+ end
35
+
36
+ def add_character(character, trie)
37
+ trie.find { |n| n.value == character } || add_node(character, trie)
38
+ end
39
+
40
+ def find_character(character, trie)
41
+ trie.find { |n| n.value == character }
42
+ end
43
+
44
+ def add_word(word)
45
+ csv_write(word)
46
+ letters = word.chars
47
+ base = @root
48
+ letters.each { |letter| base = add_character(letter, base.next) }
49
+ base.word = true
50
+ end
51
+
52
+ def find_word(word)
53
+ letters = word.chars
54
+ base = @root
55
+ word_found = letters.all? { |letter| base = find_character(letter, base.next) }
56
+ yield word_found, base if block_given?
57
+ base
58
+ end
59
+
60
+ def find?(word)
61
+ find_word(word) { |found, base| return found && base.word }
62
+ end
63
+
64
+ def include?(word)
65
+ find_word(word) { |found| return found }
66
+ end
67
+
68
+ def delete(word)
69
+ find_word(word) do |found, base|
70
+ base.word = false if found == true
71
+ end
72
+ end
73
+
74
+ def list(prefix = nil)
75
+ return @dictionary if prefix.nil?
76
+
77
+ @stack = []
78
+ @dictionary = []
79
+ @prefix_stack = []
80
+ @stack << find_word(prefix)
81
+ @prefix_stack << prefix.chars.take(prefix.size - 1)
82
+ return [] unless @stack.first
83
+
84
+ empty_stack
85
+ @dictionary
86
+ end
87
+
88
+ def empty_stack
89
+ until @stack.empty?
90
+ node = @stack.pop
91
+ @prefix_stack.pop and next if node == :guard_node
92
+
93
+ @prefix_stack << node.value
94
+ @stack << :guard_node
95
+ @dictionary << @prefix_stack.join if node.word
96
+ node.next.each { |n| @stack << n }
97
+ end
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pretree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tornike Ormotsadze
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple prefix trie gem
14
+ email: tormotsadze@unisens.ge
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/file_writer.rb
20
+ - lib/pretree.rb
21
+ homepage: https://rubygems.org/gems/prefixtree
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.2.3
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: prefixtree
44
+ test_files: []