RosettaCodeData/Task/Align-columns/Refal/align-columns.refal

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; };