# Source: segment.js

    const _attrs = Symbol('attrs')

    /**
     * A segment.
     *
     * Describes an item of the Segment Sequence of a DICOM Segmentation instance.
     *
     * @class
     * @memberof segment
     */
    class Segment {
      /**
       * @param {Object} options - Options for construction of Segment
       * @param {string} options.uid - Unique tracking identifier
       * @param {number} options.number - Segment Number (one-based index value)
       * @param {string} options.label - Segment Label
       * @param {string} options.algorithmName - Segment Algorithm Name
       * @param {Object} options.algorithmType - Segment Algorithm Type
       * @param {Object} options.propertyCategory - Segmented Property Category Code
       * @param {Object} options.propertyType - Segmented Property Type Code
       * @param {string} options.studyInstanceUID - Study Instance UID of DICOM
       * Segmentation instances
       * @param {string} options.seriesInstanceUID - Series Instance UID of DICOM
       * Segmentation instances
       * @param {string[]} options.sopInstanceUIDs - SOP Instance UIDs of DICOM
       * Segmentation instances
       * @param {string|undefined} options.paletteColorLookupTableUID - Palette
       * Color Lookup Table UID
       */
      constructor ({
        uid,
        number,
        label,
        propertyCategory,
        propertyType,
        algorithmType,
        algorithmName,
        studyInstanceUID,
        seriesInstanceUID,
        sopInstanceUIDs,
        paletteColorLookupTableUID
      }) {
        this[_attrs] = {}
        if (uid === undefined) {
          throw new Error('Unique Tracking Identifier is required.')
        } else {
          this[_attrs].uid = uid
        }

        if (number === undefined) {
          throw new Error('Segment Number is required.')
        }
        this[_attrs].number = number

        if (label === undefined) {
          throw new Error('Segment Label is required.')
        }
        this[_attrs].label = label

        if (propertyCategory === undefined) {
          throw new Error('Segmented Property Category Code is required.')
        }
        this[_attrs].propertyCategory = propertyCategory

        if (propertyType === undefined) {
          throw new Error('Segmented Property Type Code is required.')
        }
        this[_attrs].propertyType = propertyType

        if (algorithmName === undefined) {
          throw new Error('Segment Algorithm Name is required.')
        }
        this[_attrs].algorithmType = algorithmType

        if (algorithmType === undefined) {
          throw new Error('Segment Algorithm Type is required.')
        }
        this[_attrs].algorithmName = algorithmName

        if (studyInstanceUID === undefined) {
          throw new Error('Study Instance UID is required.')
        }
        this[_attrs].studyInstanceUID = studyInstanceUID

        if (seriesInstanceUID === undefined) {
          throw new Error('Series Instance UID is required.')
        }
        this[_attrs].seriesInstanceUID = seriesInstanceUID

        if (sopInstanceUIDs === undefined) {
          throw new Error('SOP Instance UIDs are required.')
        }
        this[_attrs].sopInstanceUIDs = sopInstanceUIDs

        this[_attrs].paletteColorLookupTableUID = paletteColorLookupTableUID

        Object.freeze(this)
      }

      /**
       * Unique Tracking Identifier
       *
       * @type string
       */
      get uid () {
        return this[_attrs].uid
      }

      /**
       * Segment Number.
       *
       * @type number
       */
      get number () {
        return this[_attrs].number
      }

      /**
       * Segment Label
       *
       * @type string
       */
      get label () {
        return this[_attrs].label
      }

      /**
       * Segment Algorithm Name
       *
       * @type string
       */
      get algorithmName () {
        return this[_attrs].algorithmName
      }

      /**
       * Segment Algorithm Type
       *
       * @type object
       */
      get algorithmType () {
        return this[_attrs].algorithmType
      }

      /**
       * Segmented Property Category Code
       *
       * @type object
       */
      get propertyCategory () {
        return this[_attrs].propertyCategory
      }

      /**
       * Segmented Property Type Code
       *
       * @type object
       */
      get propertyType () {
        return this[_attrs].propertyType
      }

      /**
       * Study Instance UID of DICOM Segmentation instances.
       *
       * @type string
       */
      get studyInstanceUID () {
        return this[_attrs].studyInstanceUID
      }

      /**
       * Series Instance UID of DICOM Segmentation instances.
       *
       * @type string
       */
      get seriesInstanceUID () {
        return this[_attrs].seriesInstanceUID
      }

      /**
       * SOP Instance UIDs of DICOM Segmentation instances.
       *
       * @type string[]
       */
      get sopInstanceUIDs () {
        return this[_attrs].sopInstanceUIDs
      }

      /**
       * Palette Color Lookup Table UID.
       *
       * @type string
       */
      get paletteColorLookupTableUID () {
        return this[_attrs].paletteColorLookupTableUID
      }
    }

    export { Segment }