This documentation is automatically generated by online-judge-tools/verification-helper

:warning: spec/collection/unique_spec.cr

Depends on

Code

require "spec"
require "../../src/collection/unique"

describe Enumerable do
  it "#unique" do
    [0, 0, 1, 1, 0, 0].unique.should eq [0, 1, 0]
    [0].unique.should eq [0]
    [0, 0, nil, nil, 0, 0, nil, nil].unique.should eq [0, nil, 0, nil]
    Array(Int32).new.unique.should be_empty
  end

  it "#unique(&)" do
    [0, 2, 1, 3, 0, 0, 2].unique(&.% 2).should eq [0, 1, 0]
    [0, 1, 2, 3, 4].unique { 42 }.should eq [0]
    [0].unique(&.itself).should eq [0]
    Array(Int32).new.unique { raise "" }.should be_empty
  end
end

describe Iterator do
  it "#unique" do
    [0, 0, 1, 1, 0, 0].each.unique.to_a.should eq [0, 1, 0]
    [0].each.unique.to_a.should eq [0]
    [0, 0, nil, nil, 0, 0, nil, nil].each.unique.to_a.should eq [0, nil, 0, nil]
    Array(Int32).new.each.unique.to_a.should be_empty
  end

  it "#unique(&)" do
    [0, 2, 1, 3, 0, 0, 2].each.unique(&.% 2).to_a.should eq [0, 1, 0]
    [0, 1, 2, 3, 4].each.unique { 42 }.to_a.should eq [0]
    [0].each.unique(&.itself).to_a.should eq [0]
    Array(Int32).new.each.unique { raise "" }.to_a.should be_empty
  end
end
require "spec"

# require "../../src/collection/unique"
module Enumerable(T)
  def unique : self
    unique(&.itself)
  end

  def unique(&) : self
    last = uninitialized T
    each_with_object([] of T) do |v, ary|
      now = yield v
      if ary.empty? || last != now
        last = now
        ary << v
      end
    end
  end
end

module Iterator(T)
  def unique
    unique &.itself
  end

  def unique(&func : T -> U) forall U
    Unique(typeof(self), T, U).new(self, func)
  end

  private struct Unique(I, T, U)
    include Iterator(T)
    include IteratorWrapper

    def initialize(@iterator : I, @func : T -> U)
      @first = true
      @prev_func_value = uninitialized U
    end

    def next
      loop do
        value = wrapped_next
        func_value = @func.call value
        if @first || func_value != @prev_func_value
          @first = false
          @prev_func_value = func_value
          return value
        end
      end
    end
  end
end

describe Enumerable do
  it "#unique" do
    [0, 0, 1, 1, 0, 0].unique.should eq [0, 1, 0]
    [0].unique.should eq [0]
    [0, 0, nil, nil, 0, 0, nil, nil].unique.should eq [0, nil, 0, nil]
    Array(Int32).new.unique.should be_empty
  end

  it "#unique(&)" do
    [0, 2, 1, 3, 0, 0, 2].unique(&.% 2).should eq [0, 1, 0]
    [0, 1, 2, 3, 4].unique { 42 }.should eq [0]
    [0].unique(&.itself).should eq [0]
    Array(Int32).new.unique { raise "" }.should be_empty
  end
end

describe Iterator do
  it "#unique" do
    [0, 0, 1, 1, 0, 0].each.unique.to_a.should eq [0, 1, 0]
    [0].each.unique.to_a.should eq [0]
    [0, 0, nil, nil, 0, 0, nil, nil].each.unique.to_a.should eq [0, nil, 0, nil]
    Array(Int32).new.each.unique.to_a.should be_empty
  end

  it "#unique(&)" do
    [0, 2, 1, 3, 0, 0, 2].each.unique(&.% 2).to_a.should eq [0, 1, 0]
    [0, 1, 2, 3, 4].each.unique { 42 }.to_a.should eq [0]
    [0].each.unique(&.itself).to_a.should eq [0]
    Array(Int32).new.each.unique { raise "" }.to_a.should be_empty
  end
end
Back to top page