1:- module(serializer, [
2 serialize/2 3 ]).
17serialize(PL, YAML) :-
18 serialize0('', PL, '', YAML).
19
20serialize0(LeadingSpaces, PL, YAML0, YAML) :-
21 is_dict(PL), !,
22 newline(YAML0, YAML1),
23 dict_pairs(PL, _, Pairs),
24 ( Pairs = []
25 -> atomic_list_concat([YAML0, '{}\n'], YAML)
26 ; serialize_pairs(LeadingSpaces, Pairs, YAML1, YAML)
27 ).
28
29serialize0(LeadingSpaces, PL, YAML0, YAML) :-
30 is_list(PL), !,
31 newline(YAML0, YAML1),
32 ( PL = []
33 -> atomic_list_concat([YAML0, '[]\n'], YAML)
34 ; serialize_list(LeadingSpaces, PL, YAML1, YAML)
35 ).
36
37serialize0(_, PL, YAML0, YAML) :-
38 once((number(PL); PL = true; PL = false)), !,
39 atomic_list_concat([YAML0, PL, '\n'], YAML).
40
41serialize0(LeadingSpaces, PL, YAML0, YAML) :-
42 atom(PL), !,
43 atomic_list_concat(List, '\n', PL),
44 ( List = [_]
45 -> atomic_list_concat([YAML0, PL, '\n'], YAML)
46 ; atom_concat(YAML0, '| ', YAML1),
47 indent(LeadingSpaces, LeadingSpaces1),
48 serialize_atom_with_line_separator(LeadingSpaces1, List, YAML1, YAML)
49 ).
50
51serialize0(_, PL, YAML0, YAML) :-
52 string(PL), !,
53 atom_string(Atom, PL),
54 atomic_list_concat([YAML0, '"', Atom, '"', '\n'], YAML).
55
56serialize0(_, PL, YAML0, YAML) :-
57 compound(PL), !,
58 format_time(atom(Atom), '%FT%T%z', PL), 59 atomic_list_concat([YAML0, Atom, '\n'], YAML).
60
61serialize_pairs(_, [], YAML, YAML) :- !.
62serialize_pairs(LeadingSpaces, [K-V|T], YAML0, YAML) :-
63 atomic_list_concat([YAML0, LeadingSpaces, K, ': '], YAML1),
64 indent(LeadingSpaces, LeadingSpaces1),
65 serialize0(LeadingSpaces1, V, YAML1, YAML2),
66 serialize_pairs(LeadingSpaces, T, YAML2, YAML).
67
68serialize_list(_, [], YAML, YAML) :- !.
69serialize_list(LeadingSpaces, [H|T], YAML0, YAML) :-
70 atomic_list_concat([YAML0, LeadingSpaces, '- '], YAML1),
71 indent(LeadingSpaces, LeadingSpaces1),
72 atom_concat(LeadingSpaces1, ' ', LeadingSpaces2),
73 serialize0(LeadingSpaces2, H, YAML1, YAML2),
74 serialize_list(LeadingSpaces, T, YAML2, YAML).
75
76serialize_atom_with_line_separator(LeadingSpaces, [H], YAML0, YAML) :- !,
77 atomic_list_concat([YAML0, '\n', LeadingSpaces, H, '\n'], YAML).
78
79serialize_atom_with_line_separator(LeadingSpaces, [H|T], YAML0, YAML) :-
80 atomic_list_concat([YAML0, '\n', LeadingSpaces, H], YAML1),
81 serialize_atom_with_line_separator(LeadingSpaces, T, YAML1, YAML).
82
83newline(YAML0, YAML) :-
84 atom_concat(YAML0, '\n', YAML).
85
86indent(LeadingSpaces0, LeadingSpaces) :-
87 atom_concat(LeadingSpaces0, ' ', LeadingSpaces)
YAML serializer.
The serialized result is fully YAML compatible although not utilizing every feature of YAML spec.