aboutsummaryrefslogtreecommitdiff
path: root/src/fmt.bqn
blob: 3db01657a04f30a2df922e40da4fd836d4a1785f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Format an array to a string including newlines
{
  F0𝔽  # Function to format a scalar
  FmtAtom  ( @"@","'"(∾∾⊣)⟩,F0)

  # Vertical padding for arrays of rank greater than 2
  PadV  {
    # Leading shape
    ls  ¯1↓≢𝕩
    # Empty lines after each row: 1 if it's at the end of a 2-cell, plus
    # 1 if it's at the end of a 2-cell and a 3-cell, and so on
    p   +¯1´ ×⌜˜` (-1ls)¨1
    # But none at the very end
    p  0(¯1) p
    Pad  {i/1+𝕨  (¯1¨((¬∊i)/)i)  𝕩(¯1⊑≢𝕩)" "}
    p (0ls)Pad,+´ ((×´ls)¯1⊑≢𝕩)  𝕩
  }(2 < =)

  # Horizontal padding: just some spaces on either side
  PadH  { s𝕩,𝕨' '  ∾≍s,𝕩,s }

  Pad  PadHPadV

  # Add a frame to padded data
  Enframe  (1){´2=+`-˝"⟨⟩"=𝕩}1{
    # One-line version
    "⟨"(¯11↓⊏𝕩)"⟩"
  }{
    # General case
    l  ¯1  𝕩
     
      l↑∾"┌",(5<)"·─"˜1⌊⊢,F0𝕨
      ((40𝕨-1)"·╵╎┆┊") 𝕩
      l-"┘"
    
  }

  FmtEmpty  (00≢≢)("┌┐""└┘")(((2≠=)0=≠){
    '┐'(0¯1) 2 Enframe 1 PadH " "¨𝕩
  }{
    "⟨⟩"˜(1<≠)"",'⥊'(¯1)··"‿"¨F0¨𝕩
  })

  PaddingJoin  {1 PaddingJoin 𝕩}{
    s  ¨ 𝕩
    w  (0<=),˝(=-1˙)1¨s
    h  ˝1(0<=) ¨s
    2 (02-=) (h  𝕨×w¬(-𝕨×≠w)1) ¨ 𝕩
  }

  FmtMixed  {
    (=𝕩) Enframe 2 Pad 𝕨 PaddingJoin Fmt¨𝕩
  }

  FmtSimple  ((0<+≤)+´)(⥊≤˙){ # Depth 1
    # All characters
    k  (0=) -≠ c  ¯1↓≢𝕩
    q  '"'
    # Escape quotes in strings (rank 1) and substitute control chars
    # with control pictures for other ranks.
    CSub  { 𝕩 + (𝕩('␡'-⊢)@+127) + ('␀'-@)×𝕩<@+32 }
    𝕩  (1≠=)(1+q=⊢)/,Csub 𝕩
    r  =𝕩
    (r Enframe 1 PadH PadV)(1r)  (cq) k 𝕩 k c-q
  }{
    # Not homogeneous, or empty
    (´0=≢)FmtMixedFmtEmpty 𝕩
  }{
    # All numbers
    ¯1 FmtMixed 𝕩
  }

  # Format to character matrix
  Fmt  (2⌊≡)FmtAtomFmtSimpleFmtMixed

  # Convert to string
  ¯1· (@+10)˘Fmt
}