Cover for src/ngram.cr


Lines
21 / 21 (100.00%)

1
require "./bumper"
2

        
3
class Ngram(T, N)
4
  include ::Iterator(StaticArray(T, N))
5
  @iter : Iterator(T)
6
  @overlap : T?
7
  @end : Bool
8

        
9
16
  def initialize(@iter)
10
16
    @overlap = nil
11
16
    @end = false
12
    {% raise "NGrams must be at least 2 long" if N < 2 %}
13
  end
14

        
15
  def next
16
39
    return Iterator.stop if @end
17
    result = uninitialized StaticArray(T, N)
18
    if overlap = @overlap
19
12
      result[0] = overlap
20
12
      (1...N).each do |i|
21
32
        case value = @iter.next
22
        when Iterator::Stop
23
11
          @end = true
24
11
          (i...N).each do |j|
25
13
            result[j] = bumper_item T
26
          end
27
        else
28
21
          result[i] = @overlap = value
29
        end
30
      end
31
    else
32
      # first time
33
16
      case value = @iter.next
34
      when Iterator::Stop
35
4
        @end = true
36
        return Iterator.stop
37
      else
38
12
        result[0] = bumper_item T
39
12
        result[1] = @overlap = value
40
      end
41
12
      (2...N).each do |i|
42
14
        case value = @iter.next
43
        when Iterator::Stop
44
2
          @end = true
45
2
          (i...N).each do |j|
46
2
            result[j] = bumper_item T
47
          end
48
        else
49
12
          result[i] = @overlap = value
50
        end
51
      end
52
    end
53
    result
54
  end
55
end
56