72 lines
1.9 KiB
Plaintext
72 lines
1.9 KiB
Plaintext
$ENTRY Go {
|
|
, <Arg 1>: e.File
|
|
, <Arg 2>: e.Alignment
|
|
, <ReadFile 1 e.File>: e.Lines
|
|
, <Each (Split ('$')) e.Lines>: e.Parts
|
|
, <Each (MaxWidth) <Transpose e.Parts>>: e.Cols
|
|
= <Each (AlignLine (e.Alignment) (e.Cols)) e.Parts>;
|
|
};
|
|
|
|
ReadFile {
|
|
s.Chan e.File = <Open 'r' s.Chan e.File>
|
|
<ReadFile (s.Chan)>;
|
|
(s.Chan), <Get s.Chan>: {
|
|
0 = <Close s.Chan>;
|
|
e.Line = (e.Line) <ReadFile (s.Chan)>;
|
|
};
|
|
};
|
|
|
|
Split {
|
|
(e.Sep) e.Part e.Sep e.Rest = (e.Part) <Split (e.Sep) e.Rest>;
|
|
(e.Sep) e.Part = (e.Part);
|
|
};
|
|
|
|
Each {
|
|
(e.F) = ;
|
|
(e.F) (e.X) e.Xs = (<Mu e.F e.X>) <Each (e.F) e.Xs>;
|
|
};
|
|
|
|
MaxWidth {
|
|
(Acc s.W) = s.W;
|
|
(Acc s.W) (e.P) e.X, <Len e.P>: s.L, <Compare s.L s.W>: {
|
|
'+' = <MaxWidth (Acc s.L) e.X>;
|
|
s.C = <MaxWidth (Acc s.W) e.X>;
|
|
};
|
|
e.X = <MaxWidth (Acc 0) e.X>;
|
|
};
|
|
|
|
Transpose {
|
|
e.X, <Each (Head) e.X>: e.L, <Empty e.L>: {
|
|
True = ;
|
|
False = (e.L) <Transpose <Each (Tail) e.X>>;
|
|
};
|
|
};
|
|
|
|
ZipWith {
|
|
(e.F) () e.Ys = ;
|
|
(e.F) e.Xs () = ;
|
|
(e.F) (t.X e.Xs) (t.Y e.Ys) = <Mu e.F t.X t.Y> <ZipWith (e.F) (e.Xs) (e.Ys)>;
|
|
};
|
|
|
|
AlignCell {
|
|
('left') (e.Cell) (s.Width),
|
|
<Len e.Cell>: s.L = e.Cell <Rep <Sub s.Width s.L> ' '> ' ';
|
|
('right') (e.Cell) (s.Width),
|
|
<Len e.Cell>: s.L = <Rep <Sub s.Width s.L> ' '> e.Cell ' ';
|
|
('center') (e.Cell) (s.Width),
|
|
<Divmod <Sub s.Width <Len e.Cell>> 2>: (s.P) s.V,
|
|
<Rep s.P ' '>: e.LP,
|
|
<Rep <Add s.P s.V> ' '>: e.RP = e.LP e.Cell e.RP ' ';
|
|
};
|
|
|
|
AlignLine {
|
|
(e.Alignment) (e.Cols) e.Line =
|
|
<Prout <ZipWith (AlignCell (e.Alignment)) (e.Line) (e.Cols)>>;
|
|
};
|
|
|
|
Rep { 0 s.C = ; s.N s.C = s.C <Rep <Sub s.N 1> s.C>; };
|
|
Empty { = True; () e.X = <Empty e.X>; e.X = False; };
|
|
Len { e.X, <Lenw e.X>: s.L e.X = s.L; };
|
|
Head { = ; (e.X) e.Xs = e.X; };
|
|
Tail { = ; (e.X) e.Xs = e.Xs; };
|