Class: Artic::Collection::AvailabilityCollection

Inherits:
Array
  • Object
show all
Defined in:
lib/artic/collection/availability_collection.rb

Overview

Keeps a collection of availabilities and performs calculations on them.

Author:

  • Alessandro Desantis

Instance Method Summary collapse

Instance Method Details

#by_identifier(identifier) ⇒ Object

Returns all the availabilities with the given identifier, without normalizing them.

Parameters:

  • identifier (Symbol|Date)

    a weekday or a date

Returns:

  • AvailabilityCollection



29
30
31
32
33
# File 'lib/artic/collection/availability_collection.rb', line 29

def by_identifier(identifier)
  identifier = cast_identifier identifier
  availabilities = select { |availability| availability.identifier == identifier }
  self.class.new availabilities
end

#identifier?(identifier) ⇒ Boolean

Returns whether an identifier exists in this collection.

Parameters:

  • identifier (Symbol, Date)

Returns:

  • (Boolean)


20
21
22
# File 'lib/artic/collection/availability_collection.rb', line 20

def identifier?(identifier)
  identifiers.include? cast_identifier(identifier)
end

#identifiersArray<Symbol|Date>

Returns all the identifiers in this collection.

Returns:

  • (Array<Symbol|Date>)


11
12
13
# File 'lib/artic/collection/availability_collection.rb', line 11

def identifiers
  map(&:identifier).uniq
end

#normalize(identifier) ⇒ Object

Normalizes all the availabilities with the given identifier in this collection by sorting them and merging any contiguous availability slots.

Parameters:

  • identifier (Symbol|Date)

Returns:

  • AvailabilityCollection



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/artic/collection/availability_collection.rb', line 41

def normalize(identifier)
  availabilities = by_identifier(identifier).sort

  normalized_availabilities = availabilities.inject([]) do |accumulator, availability|
    next (accumulator << availability) if accumulator.empty?

    last_availability = accumulator.pop

    next (
      accumulator + [last_availability, availability]
    ) unless last_availability.time_range.overlaps?(availability.time_range)

    new_time_range = Range.new(
      [last_availability.time_range.min, availability.time_range.min].min,
      [last_availability.time_range.max, availability.time_range.max].max
    )

    accumulator << Availability.new(availability.identifier, new_time_range)
  end

  self.class.new normalized_availabilities
end

#normalize_allObject

Normalizes all the availabilities in this collection by sorting them and merging any contiguous availability slots.

Returns:

  • AvailabilityCollection

See Also:



70
71
72
73
74
75
76
# File 'lib/artic/collection/availability_collection.rb', line 70

def normalize_all
  normalized_availabilities = identifiers.flat_map do |identifier|
    normalize identifier
  end

  self.class.new normalized_availabilities.sort
end