docs: def parse(filename):
      """parses a .ase file and returns a list of colors and color groups
  
      `swatch.parse` reads in an ase file and converts it to a list of colors and
      palettes. colors are simple dicts of the form
  
      ```json
      {
          'name': u'color name',
          'type': u'Process',
          'data': {
              'mode': u'RGB',
              'values': [1.0, 1.0, 1.0]
          }
      }
      ```
  
      the values provided vary between color mode. For all color modes, the
      value is always a list of floats.
  
      RGB: three floats between [0,1]  corresponding to RGB.
      CMYK: four floats between [0,1] inclusive, corresponding to CMYK.
      Gray: one float between [0,1] with 1 being white, 0 being black.
      LAB: three floats. The first L, is ranged from 0,1. Both A and B are
      floats ranging from [-128.0,127.0]. I believe illustrator just crops
      these to whole values, though.
  
      Palettes (née Color Groups in Adobe Parlance) are also dicts, but they have an
      attribute named `swatches` which contains a list of colors contained within
      the palette.
  
      ```json
      {
          'name': u'accent colors',
          'type': u'Color Group',
          'swatches': [
              {color}, {color}, ..., {color}
          ]
      }
      ```
  
      Because Adobe Illustrator lets swatches exist either inside and outside
      of palettes, the output of swatch.parse is a list that may contain
      swatches and palettes, i.e. [ swatch* palette* ]
  
      Here's an example with a light grey swatch followed by a color group containing three
  
          >>> import swatch
          >>> swatch.parse("example.ase")
          [{'data': {'mode': u'Gray', 'values': [0.75]},
            'name': u'Light Grey',
            'type': u'Process'},
           {'name': u'Accent Colors',
            'swatches': [{'data': {'mode': u'CMYK',
               'values': [0.5279774069786072,
                0.24386966228485107,
                1.0,
                0.04303044080734253]},
              'name': u'Green',
              'type': u'Process'},
             {'data': {'mode': u'CMYK',
               'values': [0.6261844635009766,
                0.5890134572982788,
                3.051804378628731e-05,
                3.051804378628731e-05]},
              'name': u'Violet Process Global',
              'type': u'Global'},
             {'data': {'mode': u'LAB', 'values': [0.6000000238418579, -35.0, -5.0]},
              'name': u'Cyan Spot (global)',
              'type': u'Spot'}],
            'type': u'Color Group'}]
      """
  
      with open(filename, "rb") as data:
          header, v_major, v_minor, chunk_count = struct.unpack("!4sHHI", data.read(12))
  
          assert header == b"ASEF"
          assert (v_major, v_minor) == (1, 0)
  
          return [c for c in parser.parse_chunk(data)]