displays←{⎕IO ⎕ML←0 1                                 ⍝ Boxed display of array.
    box←{                                             ⍝ Box with type and axes.
        shp w←open\⍵
        vrt hrz←(¯1+⍴w)⍴¨'│─'                         ⍝ Vert. and horiz. lines.
        top←('─⊖→')[¯1↑⍺],hrz                         ⍝ Upper border with axis.
        ok←(⍴shp)<⍴hrz
        top←(⍴top)↑(2↑top),(ok/shp),(2+ok×⍴shp)↓top
        bot←(⊃⍺),hrz                                  ⍝ Lower border with type.
        rgt←'┐│',vrt,'┘'                              ⍝ Right side with corners.
        lax←('│⌽↓')[¯1↓1↓⍺],¨⊂vrt                     ⍝ Left side(s) with axes,
        lft←⍉'┌',(↑lax),'└'                           ⍝ ... and corners.
        lft,(top⍪w⍪bot),rgt                           ⍝ Fully boxed array.
    }
    deco←{⍺←type open ⍵ ⋄ ⍺,axes ⍵}                   ⍝ Type and axes vector.
    axes←{(-2⌈⍴⍴⍵)↑1+×⍴⍵}                             ⍝ Array axis types.
    open←{(1⌈⍴⍵)⍴⍵}                                   ⍝ Expose null axes.
    trim←{(0⊃⍵)((~1 1⍷∧⌿(1⊃⍵)=' ')/(1⊃⍵))}            ⍝ Remove extra blank cols.
    type←{{(1=⍴⍵)⊃'+'⍵}∪,char¨⍵}                      ⍝ Simple array type.
    char←{⍬≡⍴⍵:'─' ⋄ (⊃⍵∊'¯',⎕D)⊃'#~'}∘⍕              ⍝ Simple scalar type.
    qfmt←{(⍕⍴⍺)(⎕FMT open ⍵)}
    {                                                 ⍝ Recursively box arrays:
        0=≡⍵:' '⍪(⎕FMT ⍵)⍪(' '≡⊃0⍴⍵)⊃' -'             ⍝ Simple scalar.
        1 ⍬≡(≡⍵)(⍴⍵):'∇' 0 0 box(,'─')(⎕FMT ⍵)        ⍝ Object rep: ⎕OR.
        1=≡⍵:(deco ⍵)box open ⍵ qfmt ⍵                ⍝ Simple array.
        ('∊'deco ⍵)box trim ⍵ qfmt ∇¨open ⍵           ⍝ Nested array.
    }⍵
}

code_colours

test script

Back to: notes

Back to: Workspaces