nodes: 0, module; 1, function_definition; 2, function_name:get_ceiling; 3, parameters; 4, type; 5, comment:# type: ignore; 6, block; 7, typed_parameter; 8, identifier:Cloud; 9, expression_statement; 10, for_statement; 11, return_statement; 12, identifier:clouds; 13, type; 14, comment:"""
      Returns ceiling layer from Cloud-List or None if none found
  
      Assumes that the clouds are already sorted lowest to highest
  
      Only 'Broken', 'Overcast', and 'Vertical Visibility' are considdered ceilings
  
      Prevents errors due to lack of cloud information (eg. '' or 'FEW///')
      """; 15, identifier:cloud; 16, identifier:clouds; 17, block; 18, None; 19, list; 20, if_statement; 21, identifier:Cloud; 22, boolean_operator; 23, block; 24, attribute; 25, comparison_operator:cloud.type in ('OVC', 'BKN', 'VV'); 26, return_statement; 27, identifier:cloud; 28, identifier:altitude; 29, attribute; 30, tuple; 31, identifier:cloud; 32, identifier:cloud; 33, identifier:type; 34, string; 35, string; 36, string; 37, string_content:OVC; 38, string_content:BKN; 39, string_content:VV
code: def get_ceiling(clouds: [Cloud]) -> Cloud:  # type: ignore
      """
      Returns ceiling layer from Cloud-List or None if none found
  
      Assumes that the clouds are already sorted lowest to highest
  
      Only 'Broken', 'Overcast', and 'Vertical Visibility' are considdered ceilings
  
      Prevents errors due to lack of cloud information (eg. '' or 'FEW///')
      """
      for cloud in clouds:
          if cloud.altitude and cloud.type in ('OVC', 'BKN', 'VV'):
              return cloud
      return None