/
list.rb
79 lines (64 loc) · 1.85 KB
/
list.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# frozen_string_literal: true
module Sass
module Value
# Sass's list type.
#
# @see https://sass-lang.com/documentation/js-api/classes/SassList
class List
include Value
# @param contents [Array<Value>]
# @param separator [::String]
# @param bracketed [::Boolean]
def initialize(contents = [], separator: ',', bracketed: false)
if separator.nil? && contents.length > 1
raise Sass::ScriptError, 'A list with more than one element must have an explicit separator'
end
@contents = contents.freeze
@separator = separator.freeze
@bracketed = bracketed.freeze
end
# @return [Array<Value>]
attr_reader :contents
# @return [::String, nil]
attr_reader :separator
# @return [::Boolean]
def bracketed?
@bracketed
end
# @return [::Boolean]
def ==(other)
(other.is_a?(Sass::Value::List) &&
other.contents == contents &&
other.separator == separator &&
other.bracketed? == bracketed?) ||
(to_a.empty? && other.is_a?(Sass::Value::Map) && other.to_a.empty?)
end
# @param index [Numeric]
# @return [Value]
def at(index)
index = index.floor
index = to_a.length + index if index.negative?
return nil if index.negative? || index >= to_a.length
to_a[index]
end
# @return [Integer]
def hash
@hash ||= contents.hash
end
alias to_a contents
# @return [Map, nil]
def to_map
to_a.empty? ? Sass::Value::Map.new({}) : nil
end
# @return [Map]
# @raise [ScriptError]
def assert_map(name = nil)
to_a.empty? ? Sass::Value::Map.new({}) : super.assert_map(name)
end
private
def to_a_length
to_a.length
end
end
end
end