lib/twitter_cldr/shared/day_periods.rb
# encoding: UTF-8
# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0
require 'singleton'
module TwitterCldr
module Shared
class DayPeriods
class Timestamp
include Comparable
attr_reader :hour, :min, :sec
def initialize(hour, min, sec)
@hour = hour
@min = min
@sec = sec
end
def to_f
@to_f ||= hour * 60 * 60 + min * 60.0 + sec
end
def <=>(other)
to_f <=> other.to_f
end
end
class Rule
def self.create(name, params)
return AtRule.new(name, params) if params.include?(:at)
FromRule.new(name, params)
end
attr_reader :name, :params
def initialize(name, params)
@name = name
@params = params
end
end
class FromRule < Rule
def <=>(other)
return 1 if other.params[:at]
timespan <=> other.timespan
end
def timespan
@timespan ||= if from > before
(24 - from.to_f) + before.to_f
else
before.to_f - from.to_f
end
end
def from
@from ||= Timestamp.new(
params[:from][:hour], params[:from][:min], 0
)
end
def before
@before ||= Timestamp.new(
params[:before][:hour], params[:before][:min], 0
)
end
def matches?(timestamp)
if from > before
timestamp >= from || timestamp < before
else
timestamp >= from && timestamp < before
end
end
end
class AtRule < Rule
def <=>(other)
-1
end
def timespan
0
end
def at
@at ||= Timestamp.new(
params[:at][:hour], params[:at][:min], 0
)
end
def matches?(timestamp)
timestamp == at
end
end
include Singleton
class << self
def instance(locale)
instance_cache[locale] ||= new(locale)
end
private
def instance_cache
@instance_cache ||= {}
end
end
attr_reader :locale, :rule_set
def period_type_for(time)
timestamp = Timestamp.new(time.hour, time.min, time.sec)
rule = rules.find { |rule| rule.matches?(timestamp) }
rule.name
end
def initialize(locale, rule_set = :default)
@locale = locale
@rule_set = rule_set
end
private
def rules
@rules ||= resource[rule_set].map do |name, params|
Rule.create(name, params)
end.sort
end
def resource
TwitterCldr.get_locale_resource(locale, :day_periods)[locale]
end
end
end
end