rambling-trie 0.0.1

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. data/lib/rambling-trie.rb +3 -0
  2. data/lib/trie.rb +17 -0
  3. data/lib/trie_node.rb +64 -0
  4. metadata +47 -0
@@ -0,0 +1,3 @@
1
+ require File.join(File.dirname(__FILE__), 'trie_node.rb')
2
+ require File.join(File.dirname(__FILE__), 'trie.rb')
3
+
@@ -0,0 +1,17 @@
1
+ module Rambling
2
+ class Trie < TrieNode
3
+ def initialize(filename = nil)
4
+ super(nil)
5
+
6
+ @filename = filename
7
+ add_all_nodes if filename
8
+ end
9
+
10
+ private
11
+ def add_all_nodes
12
+ File.open(@filename) do |file|
13
+ file.readlines.each { |word| add_branch_from(word.chomp) }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,64 @@
1
+ module Rambling
2
+ class TrieNode
3
+ attr_reader :letter, :children
4
+
5
+ def initialize(word)
6
+ @letter = nil
7
+ @is_terminal = false
8
+ @children = {}
9
+
10
+ unless word.nil?
11
+ @letter = word.slice!(0)
12
+ @is_terminal = word.empty?
13
+ add_branch_from(word)
14
+ end
15
+
16
+ end
17
+
18
+ def terminal=(terminal)
19
+ @is_terminal = terminal
20
+ end
21
+
22
+ def terminal?
23
+ @is_terminal
24
+ end
25
+
26
+ def [](key)
27
+ @children[key]
28
+ end
29
+
30
+ def has_key?(key)
31
+ @children.has_key?(key)
32
+ end
33
+
34
+ def add_branch_from(word)
35
+ unless word.empty?
36
+ first_letter = word.slice(0)
37
+
38
+ if @children.has_key?(first_letter)
39
+ word.slice!(0)
40
+ @children[first_letter].add_branch_from(word)
41
+ else
42
+ @children[first_letter] = TrieNode.new(word)
43
+ end
44
+ end
45
+ end
46
+
47
+ def has_branch_tree?(word)
48
+ return true if word.empty?
49
+ passes_condition(word) { |node, sliced_word| node.has_branch_tree?(sliced_word) }
50
+ end
51
+
52
+ def is_word?(word)
53
+ return true if word.empty? and terminal?
54
+ passes_condition(word) { |node, sliced_word| node.is_word?(sliced_word) }
55
+ end
56
+
57
+ private
58
+ def passes_condition(word, &block)
59
+ first_letter = word.slice!(0)
60
+ return block.call(@children[first_letter], word) if @children.has_key?(first_letter)
61
+ false
62
+ end
63
+ end
64
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rambling-trie
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rambling Labs
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-04 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: A custom trie implementation
15
+ email: development@ramblinglabs.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/rambling-trie.rb
21
+ - lib/trie.rb
22
+ - lib/trie_node.rb
23
+ homepage: http://rubygems.org/gems/rambling-trie
24
+ licenses: []
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.10
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: Rambling Trie
47
+ test_files: []