:- module pprint.
:- use_module array, builtin, char, enum, exception, float, int, io, list, map, private_builtin, sparse_bitset, std_util, string, term.
:- type (pprint:map_pair(K, V))
	--->	map_pair(K, V)
	.
:- type (pprint:doc)
	--->	'NIL'
	;	'SEQ'((pprint:doc), (pprint:doc))
	;	'NEST'(int, (pprint:doc))
	;	'LABEL'(string, (pprint:doc))
	;	'TEXT'(string)
	;	'LINE'
	;	'GROUP'((pprint:doc))
	;	'DOC'(int, (std_util:univ))
	.
:- instance (pprint:doc(pprint : doc)).
:- instance (pprint:doc(string)).
:- instance (pprint:doc(int)).
:- instance (pprint:doc(float)).
:- instance (pprint:doc(character)).
:- pred pprint:layout_best(pred(string, T_1, T_1), int, (pprint:doc), T_1, T_1).
:- mode pprint:layout_best((pred((builtin:in), (builtin:di), (builtin:uo)) is det), (builtin:in), (builtin:in), (builtin:di), (builtin:uo)) is det.
:- mode pprint:layout_best((pred((builtin:in), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:in), (builtin:in), (builtin:out)) is det.
:- pred pprint:lb(pred(string, T_1, T_1), int, int, int, string, (pprint:doc), T_1, T_1).
:- mode pprint:lb((pred((builtin:in), (builtin:di), (builtin:uo)) is det), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:in), (builtin:di), (builtin:uo)) is det.
:- mode pprint:lb((pred((builtin:in), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:in), (builtin:in), (builtin:out)) is det.
pprint:doc(X_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:doc(V_4, X_3),
		V_4 = int:max_int.
pprint:(Doc1_4 ++ Doc2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:'<>'(V_6, V_7),
		V_6 = pprint:doc(Doc1_4),
		V_7 = pprint:doc(Doc2_5).
pprint:nil = (pprint:'NIL').
pprint:text(S_3) = (pprint:'TEXT'(S_3)).
pprint:'<>'(X_4, Y_5) = (pprint:'SEQ'(X_4, Y_5)).
pprint:line = (pprint:'LINE').
pprint:nest(I_4, X_5) = (pprint:'NEST'(I_4, V_6)) :-
		V_6 = pprint:doc(X_5).
pprint:label(L_4, X_5) = (pprint:'LABEL'(L_4, V_6)) :-
		V_6 = pprint:doc(X_5).
pprint:group(X_3) = (pprint:'GROUP'(V_4)) :-
		V_4 = pprint:doc(X_3).
pprint:'</>'(X_4, Y_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:(X_4 ++ V_6),
		V_6 = pprint:(V_7 ++ Y_5),
		V_7 = pprint:line.
pprint:bracketed(L_5, R_6, D_7) = HeadVar__4_4 :-
		HeadVar__4_4 = pprint:(L_5 ++ V_8),
		V_8 = pprint:(D_7 ++ R_6).
pprint:parentheses(D_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:bracketed(V_4, V_5, D_3),
		V_4 = "(",
		V_5 = ")".
pprint:brackets(D_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:bracketed(V_4, V_5, D_3),
		V_4 = "[",
		V_5 = "]".
pprint:braces(D_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:bracketed(V_4, V_5, D_3),
		V_4 = "{",
		V_5 = "}".
pprint:packed(Sep_4, Xs_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:packed(V_6, Sep_4, Xs_5),
		V_6 = int:max_int.
pprint:packed_cs(Xs_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:packed(V_4, Xs_3),
		V_4 = ", ".
pprint:packed_cs(N_4, Xs_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:packed(N_4, V_6, Xs_5),
		V_6 = ", ".
pprint:packed_cs_to_depth(Depth_4, Xs_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:packed_cs(Depth_4, V_6),
		V_6 = list:map(V_7, Xs_5),
		V_7 = pprint:to_doc(Depth_4).
pprint:packed_cs_univ_args(Depth_4, UnivArgs_5) = HeadVar__3_3 :-
		HeadVar__3_3 = pprint:packed_cs(Depth_4, V_7),
		V_7 = list:map(V_8, UnivArgs_5),
		V_8 = (func(V_10::(builtin:in)) = (V_9::(builtin:out)) is det :-
			some [] (
				V_10 = UA_11,
				V_9 = pprint:'DOC'(Depth_4, UA_11)
			)
		).
pprint:separated(V_5, V_6, (list:[])) = HeadVar__4_4 :-
		HeadVar__4_4 = pprint:nil.
pprint:separated(PP_7, Sep_8, (list:[X_9 | Xs_10])) = HeadVar__4_4 :-
		(if
			Xs_10 = list:[]
		then
			HeadVar__4_4 = apply(PP_7, X_9)
		else
			HeadVar__4_4 = pprint:(V_11 ++ V_12),
			V_11 = apply(PP_7, X_9),
			V_12 = pprint:(Sep_8 ++ V_13),
			V_13 = pprint:separated(PP_7, Sep_8, Xs_10)
		).
pprint:comma = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = ",".
pprint:semic = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = ";".
pprint:colon = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = ":".
pprint:space = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = " ".
pprint:comma_space = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = ", ".
pprint:semic_space = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = "; ".
pprint:colon_space = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = ": ".
pprint:comma_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = ",",
		V_3 = pprint:line.
pprint:semic_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = ";",
		V_3 = pprint:line.
pprint:colon_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = ":",
		V_3 = pprint:line.
pprint:space_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = " ",
		V_3 = pprint:line.
pprint:comma_space_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = ", ",
		V_3 = pprint:line.
pprint:semic_space_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = "; ",
		V_3 = pprint:line.
pprint:colon_space_line = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:(V_2 ++ V_3),
		V_2 = ": ",
		V_3 = pprint:line.
pprint:ellipsis = HeadVar__1_1 :-
		HeadVar__1_1 = pprint:text(V_2),
		V_2 = "...".
pprint:to_doc(X_3) = HeadVar__2_2 :-
		HeadVar__2_2 = pprint:to_doc(V_4, X_3),
		V_4 = int:max_int.
pprint:write(W_5, X_6, DCG_0_7, DCG_1_8) :-
		V_9 = io:write_string,
		V_10 = pprint:doc(X_6),
		pprint:layout_best(V_9, W_5, V_10, DCG_0_7, DCG_1_8).
pprint:write(Stream_6, W_7, X_8, DCG_0_9, DCG_1_10) :-
		V_11 = io:write_string(Stream_6),
		V_12 = pprint:doc(X_8),
		pprint:layout_best(V_11, W_7, V_12, DCG_0_9, DCG_1_10).
pprint:layout_best(P_6, W_7, X_8, S0_9, S_10) :-
		V_12 = 0,
		V_13 = "",
		pprint:lb(P_6, W_7, V_12, V_11, V_13, X_8, S0_9, S_10).
:- pragma termination_info(pprint:doc((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:doc((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:'++'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:nil) = (builtin:out), finite(0, [no]), cannot_loop).
:- pragma termination_info(pprint:text((builtin:in)) = (builtin:out), finite(1, [yes, no]), cannot_loop).
:- pragma termination_info(pprint:'<>'((builtin:in), (builtin:in)) = (builtin:out), finite(2, [yes, yes, no]), cannot_loop).
:- pragma termination_info((pprint:line) = (builtin:out), finite(0, [no]), cannot_loop).
:- pragma termination_info(pprint:nest((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:label((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:group((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:poly((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:'</>'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:bracketed((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:parentheses((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:brackets((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:braces((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed_cs((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed_cs((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed_cs_to_depth((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:packed_cs_univ_args((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:separated((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:comma) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:semic) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:colon) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:space) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:comma_space) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:semic_space) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:colon_space) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info((pprint:comma_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:semic_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:colon_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:space_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:comma_space_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:semic_space_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:colon_space_line) = (builtin:out), infinite, can_loop).
:- pragma termination_info((pprint:ellipsis) = (builtin:out), finite(1, [no]), cannot_loop).
:- pragma termination_info(pprint:word_wrapped((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:to_doc((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:to_doc((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:to_string((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(pprint:write((builtin:in), (builtin:in), (builtin:di), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(pprint:write((builtin:in), (builtin:in), (builtin:in), (builtin:di), (builtin:uo)), infinite, can_loop).
