:- module foo.
:- interface.
:- import_module io.

:- pred main(io::di, io::uo) is det.

:- implementation.
:- import_module assoc_list.
:- import_module map.
:- import_module list.
:- import_module pair.
:- import_module pretty_printer.
:- import_module univ.

:- type foo ---> bar ; baz.

	% XXX This does not appear to call init_foo/2!
:- initialise init_foo/2.

:- pred init_foo(io::di, io::uo) is det.

init_foo(!IO) :-
	pretty_printer.get_default_formatter_map(FM0, !IO),
	FM = pretty_printer.set_formatter("foo", "foo", 0, fmt_foo, FM0),
	pretty_printer.set_default_formatter_map(FM, !IO).

:- func fmt_foo : formatter.

fmt_foo(Univ, _) = Doc :-
	( if Univ = univ(Foo) then
		(	Foo = bar,	Doc = str("BAR")
		;	Foo = baz,	Doc = str("BAZ")
		)
	  else
	  	Doc = str("?Not a foo?")
	).

main(!IO) :-
	init_foo(!IO), % XXX This should not be necessary.
	X : map(int, foo) = map.from_assoc_list([1 - baz, 2 - bar, 3 - baz]),
	pretty_printer.write_doc(format(X), !IO),
	io.nl(!IO).
