// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

[ Constructor ]
interface SequenceUser {
  sequence<ArbitraryInterface> getInterfaceSequence();
  sequence<sequence<sequence<ArbitraryInterface>>>
  getInterfaceSequenceSequenceSequence();
  sequence<long> getLongSequence();
  sequence<DOMString> getStringSequence();
  sequence<sequence<DOMString>> getStringSequenceSequence();
  (DOMString or sequence<DOMString>) getUnionOfStringAndStringSequence();
  sequence<(DOMString or ArbitraryInterface)> getUnionSequence();

  void setInterfaceSequence(sequence<ArbitraryInterface> elements);
  void setInterfaceSequenceSequenceSequence(
      sequence<sequence<sequence<ArbitraryInterface>>> elements);
  void setLongSequence(sequence<long> elements);
  void setStringSequence(sequence<DOMString> elements);
  void setStringSequenceSequence(sequence<sequence<DOMString>> elements);
  void setUnionOfStringAndStringSequence(
      (DOMString or sequence<DOMString>) elements);
  void setUnionSequence(sequence<(DOMString or ArbitraryInterface)> elements);
};
