code: def recursive_build(t):
      frames = []
  
      frames.append(widgets.HTML(get_type_html(t)))
  
      if isinstance(t, hl.tstruct):
          append_struct_frames(t, frames)
      elif isinstance(t, hl.ttuple):
          if len(t) == 0:
              frames.append(widgets.HTML("<big>No fields.</big>"))
          else:
              frames.append(widgets.HTML("<big>Fields:</big>"))
          acc = widgets.Accordion([recursive_build(x) for x in t.types])
          for i, fd in enumerate(t.types):
              acc.set_title(i, f"[{i}] ({summary_type(fd)})")
          acc.selected_index = None
          frames.append(acc)
      elif isinstance(t, (hl.tarray, hl.tset)):
          acc = widgets.Accordion([recursive_build(t.element_type)])
          acc.set_title(
              0, f"<element> ({summary_type(t.element_type)})"
          )
          acc.selected_index = None
          frames.append(acc)
      elif isinstance(t, hl.tdict):
          acc = widgets.Accordion(
              [
                  recursive_build(t.key_type),
                  recursive_build(t.value_type),
              ]
          )
          acc.set_title(0, f"<key> ({summary_type(t.key_type)})")
          acc.set_title(1, f"<value> ({summary_type(t.element_type)})")
          acc.selected_index = None
          frames.append(acc)
      elif isinstance(t, (hl.tinterval)):
          acc = widgets.Accordion([recursive_build(t.point_type)])
          acc.set_title(0, f"<point> ({summary_type(t.point_type)})")
          acc.selected_index = None
          frames.append(acc)
  
      return widgets.VBox(frames)
  
file_path: hail/hail/python/hail/experimental/interact.py
imports: from IPython.display import display
  from ipywidgets import widgets
  import hail
  from hail.expr.types import summary_type
label_desc: Use image node_id 7 for calling a global function with example usage: recursive_build(t) and returns: widgets