! Copyright (C) 2023 Jean-Marc Lugrin. ! See https://factorcode.org/license.txt for BSD license. ! Print a class heierarchy in the listener USING: classes hashtables ui.gadgets assocs kernel sequences prettyprint vectors math io formatting strings sorting accessors io.styles ; IN: introspection.gadget-classes > swap write-object ; : print-class ( c i -- ) 2 * CHAR: . write ! leader print-class-name nl ; : print-superclasses ( c -- ) superclass-of dup [ " < " write [ print-class-name ] [ print-superclasses ] bi ] [ drop ] if ; : print-root-class ( c -- ) [ print-class-name ] [ print-superclasses ] bi nl ; :: print-children ( h c i -- ) i 0 = [ c print-root-class ] [ c i print-class ] if c h at [ h swap i 1 + print-children ] each ; PRIVATE> : print-hierarchy ( aclass -- ) ! Get the hierarchy of all classes ! Hastable class -> empty mutable vector classes [ drop V{ } clone ] zip-with >hashtable ! for each child-class, add it to its parent vector classes [ over add-child ] each [ sort ] assoc-map ! Print from the desired root class swap 0 print-children ;