Class: Kotoshu::Suggestions::SuggestionSet
- Inherits:
-
Object
- Object
- Kotoshu::Suggestions::SuggestionSet
- Includes:
- Enumerable
- Defined in:
- lib/kotoshu/suggestions/suggestion_set.rb
Overview
A collection of suggestions with rich query methods. This is MORE OOP than Spylls which returns plain iterators of strings.
Instance Attribute Summary collapse
-
#max_size ⇒ Object
readonly
Returns the value of attribute max_size.
-
#suggestions ⇒ Object
readonly
Returns the value of attribute suggestions.
Class Method Summary collapse
-
.empty(max_size: 10) ⇒ SuggestionSet
Create an empty suggestion set.
-
.from_words(words, source: :unknown, max_size: 10) ⇒ SuggestionSet
Create a suggestion set from an array of words.
Instance Method Summary collapse
-
#add(suggestion) ⇒ SuggestionSet
(also: #<<)
Add a suggestion to the set.
-
#as_json ⇒ Array<Hash>
Convert to JSON-compatible array.
-
#concat(new_suggestions) ⇒ SuggestionSet
Add multiple suggestions.
-
#each {|suggestion| ... } ⇒ Enumerator
Iterate over suggestions.
-
#empty? ⇒ Boolean
Check if the set is empty.
-
#find_word(word) ⇒ Suggestion?
Find a suggestion by word.
-
#first ⇒ Suggestion?
Get the first (best) suggestion.
-
#from_source(source) ⇒ SuggestionSet
Get suggestions by source.
-
#high_confidence ⇒ SuggestionSet
Get high-confidence suggestions.
-
#include?(word) ⇒ Boolean
(also: #has_word?)
Check if set contains a specific word.
-
#initialize(suggestions = [], max_size: 10) ⇒ SuggestionSet
constructor
A new instance of SuggestionSet.
-
#inspect ⇒ String
Inspect the suggestion set.
-
#last ⇒ Suggestion?
Get the last suggestion.
-
#low_confidence ⇒ SuggestionSet
Get low-confidence suggestions.
-
#merge!(other) ⇒ SuggestionSet
Merge another suggestion set into this one.
-
#size ⇒ Integer
(also: #count, #length)
Get the number of suggestions.
-
#to_hashes ⇒ Array<Hash>
Convert to an array of hashes for serialization.
-
#to_s ⇒ String
String representation.
-
#to_words ⇒ Array<String>
(also: #words)
Convert to array of words.
-
#top(n) ⇒ Array<Suggestion>
Get the top N suggestions.
-
#unique ⇒ SuggestionSet
Get unique suggestions (by word, case-insensitive).
-
#within_distance(min_distance: 0, max_distance: 2) ⇒ SuggestionSet
Get suggestions within a distance range.
Constructor Details
#initialize(suggestions = [], max_size: 10) ⇒ SuggestionSet
Returns a new instance of SuggestionSet.
14 15 16 17 18 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 14 def initialize(suggestions = [], max_size: 10) @suggestions = suggestions @max_size = max_size sort_and_limit! end |
Instance Attribute Details
#max_size ⇒ Object (readonly)
Returns the value of attribute max_size.
10 11 12 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 10 def max_size @max_size end |
#suggestions ⇒ Object (readonly)
Returns the value of attribute suggestions.
10 11 12 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 10 def suggestions @suggestions end |
Class Method Details
.empty(max_size: 10) ⇒ SuggestionSet
Create an empty suggestion set.
213 214 215 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 213 def self.empty(max_size: 10) new([], max_size: max_size) end |
.from_words(words, source: :unknown, max_size: 10) ⇒ SuggestionSet
Create a suggestion set from an array of words.
223 224 225 226 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 223 def self.from_words(words, source: :unknown, max_size: 10) suggestions = words.map { |w| Suggestion.from_word(w, source: source) } new(suggestions, max_size: max_size) end |
Instance Method Details
#add(suggestion) ⇒ SuggestionSet Also known as: <<
Add a suggestion to the set.
24 25 26 27 28 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 24 def add(suggestion) @suggestions << suggestion sort_and_limit! self end |
#as_json ⇒ Array<Hash>
Convert to JSON-compatible array.
187 188 189 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 187 def as_json(*) to_hashes end |
#concat(new_suggestions) ⇒ SuggestionSet
Add multiple suggestions.
35 36 37 38 39 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 35 def concat(new_suggestions) @suggestions.concat(new_suggestions) sort_and_limit! self end |
#each {|suggestion| ... } ⇒ Enumerator
Iterate over suggestions.
143 144 145 146 147 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 143 def each(&) return enum_for(:each) unless block_given? @suggestions.each(&) end |
#empty? ⇒ Boolean
Check if the set is empty.
126 127 128 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 126 def empty? @suggestions.empty? end |
#find_word(word) ⇒ Suggestion?
Find a suggestion by word.
97 98 99 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 97 def find_word(word) @suggestions.find { |s| s.same_word?(word) } end |
#first ⇒ Suggestion?
Get the first (best) suggestion.
112 113 114 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 112 def first @suggestions.first end |
#from_source(source) ⇒ SuggestionSet
Get suggestions by source.
54 55 56 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 54 def from_source(source) SuggestionSet.new(@suggestions.select { |s| s.from_source?(source) }, max_size: @max_size) end |
#high_confidence ⇒ SuggestionSet
Get high-confidence suggestions.
61 62 63 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 61 def high_confidence SuggestionSet.new(@suggestions.select(&:high_confidence?), max_size: @max_size) end |
#include?(word) ⇒ Boolean Also known as: has_word?
Check if set contains a specific word.
88 89 90 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 88 def include?(word) @suggestions.any? { |s| s.same_word?(word) } end |
#inspect ⇒ String
Inspect the suggestion set.
201 202 203 204 205 206 207 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 201 def inspect if @suggestions.empty? to_s else "#{self} [#{@suggestions.map(&:word).join(', ')}]" end end |
#last ⇒ Suggestion?
Get the last suggestion.
119 120 121 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 119 def last @suggestions.last end |
#low_confidence ⇒ SuggestionSet
Get low-confidence suggestions.
68 69 70 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 68 def low_confidence SuggestionSet.new(@suggestions.select(&:low_confidence?), max_size: @max_size) end |
#merge!(other) ⇒ SuggestionSet
Merge another suggestion set into this one.
45 46 47 48 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 45 def merge!(other) concat(other.suggestions) self end |
#size ⇒ Integer Also known as: count, length
Get the number of suggestions.
133 134 135 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 133 def size @suggestions.size end |
#to_hashes ⇒ Array<Hash>
Convert to an array of hashes for serialization.
Use this when you need the Hash shape (e.g. JSON output). For the enumerable contract, #to_a / #each yield Kotoshu::Suggestions::Suggestion objects.
180 181 182 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 180 def to_hashes @suggestions.map(&:to_hash) end |
#to_s ⇒ String
String representation.
194 195 196 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 194 def to_s "SuggestionSet(size: #{size}, max_size: #{@max_size})" end |
#to_words ⇒ Array<String> Also known as: words
Convert to array of words.
169 170 171 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 169 def to_words @suggestions.map(&:word) end |
#top(n) ⇒ Array<Suggestion>
Get the top N suggestions.
105 106 107 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 105 def top(n) @suggestions.first(n) end |
#unique ⇒ SuggestionSet
Get unique suggestions (by word, case-insensitive).
152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 152 def unique seen = {} unique_suggestions = @suggestions.select do |s| word = s.word.downcase if seen[word] false else seen[word] = true true end end SuggestionSet.new(unique_suggestions, max_size: @max_size) end |
#within_distance(min_distance: 0, max_distance: 2) ⇒ SuggestionSet
Get suggestions within a distance range.
77 78 79 80 81 82 |
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 77 def within_distance(min_distance: 0, max_distance: 2) filtered = @suggestions.select do |s| s.distance >= min_distance && s.distance <= max_distance end SuggestionSet.new(filtered, max_size: @max_size) end |