docs: def buffer_side(linestring, side, buffer):
      """
      Given a Shapely LineString, a side of the LineString
      (string; 'left' = left hand side of LineString,
      'right' = right hand side of LineString, or
      'both' = both sides), and a buffer size in the distance units of
      the LineString, buffer the LineString on the given side by
      the buffer size and return the resulting Shapely polygon.
      """
      b = linestring.buffer(buffer, cap_style=2)
      if side in ['left', 'right'] and buffer > 0:
          # Make a tiny buffer to split the normal-size buffer
          # in half across the linestring
          eps = min(buffer/2, 0.001)
          b0 = linestring.buffer(eps, cap_style=3)
          diff = b.difference(b0)
          polys = so.polygonize(diff)
          # Buffer sides slightly to include original linestring
          if side == 'left':
              b = list(polys)[0].buffer(1.1*eps)
          else:
              b = list(polys)[-1].buffer(1.1*eps)
  
      return b