prefixtreee 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 +20 -0
  3. data/lib/prefixtreee.rb +110 -0
  4. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c536f0009f09bb1c22ee8ff88e678014d698f7fd1300ef1b1c76492849cea915
4
+ data.tar.gz: 3324dc097be92ad0be7c7a25c89a5b575e58858b3f7b28585088a77974e7383f
5
+ SHA512:
6
+ metadata.gz: fcad3ca3a0a35c07788e2d285b3aead65e7dba4b62122d93b761db9db7962a1549e47b60b0c8a5649ee76d9ed975d54e18109042d9d0a9534a95e0aa58078bc6
7
+ data.tar.gz: bf9e589f5c17bb1d491cda0bb9a66209a77905337c26e250474f95d3b2e91ac94ba188134bef22b0151875fdcf903575a26b3cbb2ff2b2b9a33659ad26be2f6b
@@ -0,0 +1,20 @@
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
20
+
@@ -0,0 +1,110 @@
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
+ @next = []
12
+ @value = value
13
+ @word = false
14
+ end
15
+ end
16
+
17
+ # Prefix tree (Trie class)
18
+ class PrefixTreee
19
+ def initialize
20
+ @root = Node.new('root')
21
+ @csv_container = CSVWrite.new
22
+ end
23
+
24
+ def call
25
+ csv_write(word)
26
+ csv_read
27
+ add_word(word)
28
+ find?(word)
29
+ include?(word)
30
+ delete(word)
31
+ list(prefix)
32
+ end
33
+
34
+ def csv_write(word)
35
+ @csv_container.write(word)
36
+ end
37
+
38
+ def csv_read
39
+ @csv_container.read
40
+ end
41
+
42
+ def add_node(character, trie)
43
+ Node.new(character).tap { |new_node| trie << new_node }
44
+ end
45
+
46
+ def add_character(character, trie)
47
+ trie.find { |n| n.value == character } || add_node(character, trie)
48
+ end
49
+
50
+ def find_character(character, trie)
51
+ trie.find { |n| n.value == character }
52
+ end
53
+
54
+ def add_word(word)
55
+ csv_write(word)
56
+ letters = word.chars
57
+ base = @root
58
+ letters.each { |letter| base = add_character(letter, base.next) }
59
+ base.word = true
60
+ end
61
+
62
+ def find_word(word)
63
+ letters = word.chars
64
+ base = @root
65
+ word_found = letters.all? { |letter| base = find_character(letter, base.next) }
66
+ yield word_found, base if block_given?
67
+ base
68
+ end
69
+
70
+ def find?(word)
71
+ find_word(word) { |found, base| return found && base.word }
72
+ end
73
+
74
+ def include?(word)
75
+ find_word(word) { |found| return found }
76
+ end
77
+
78
+ def delete(word)
79
+ find_word(word) do |found, base|
80
+ base.word = false if found == true
81
+ end
82
+ end
83
+
84
+ def list(prefix = nil)
85
+ return @dictionary if prefix.nil?
86
+
87
+ @stack = []
88
+ @dictionary = []
89
+ @prefix_stack = []
90
+ @stack << find_word(prefix)
91
+ @prefix_stack << prefix.chars.take(prefix.size - 1)
92
+ return [] unless @stack.first
93
+
94
+ empty_stack
95
+ @dictionary
96
+ end
97
+
98
+ def empty_stack
99
+ until @stack.empty?
100
+ node = @stack.pop
101
+ @prefix_stack.pop and next if node == :guard_node
102
+
103
+ @prefix_stack << node.value
104
+ @stack << :guard_node
105
+ @dictionary << @prefix_stack.join if node.word
106
+ node.next.each { |n| @stack << n }
107
+ end
108
+ end
109
+ end
110
+
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prefixtreee
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Giorgi Bobokhidze
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: gbobokhidze@unisens.ge
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/file_writer.rb
20
+ - lib/prefixtreee.rb
21
+ homepage: https://rubygems.org/gems/prefixtreee
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: prefixtreee
44
+ test_files: []