Files
mercury/tests/hard_coded/test_cord2.exp
Peter Wang 36469c5975 Make cord foldl tail-recursive.
Make cord.foldl and cord.foldl_pred tail-recursive.  This may be
expected by users as cords are often used as a replacement for lists.

Also make the recursive calls in cord.foldr and cord.foldr_pred amenable
to last call optimisation.  However, they still use stack space
proportional to the size of the input due to calling list.foldr.

library/cord.m:
	As above.

tests/hard_coded/test_cord2.m:
tests/hard_coded/test_cord2.exp:
	Add tests for fold order.

NEWS:
	Announce the change.
2014-01-15 14:50:32 +11:00

125 lines
5.3 KiB
Plaintext

Test list and rev_list
empty_cord
[]
[]
nonempty_cord(unit_node(1))
[1]
[1]
nonempty_cord(list_node(2, [3, 4]))
[2, 3, 4]
[4, 3, 2]
nonempty_cord(branch_node(unit_node(1), unit_node(1)))
[1, 1]
[1, 1]
nonempty_cord(branch_node(unit_node(1), list_node(2, [3, 4])))
[1, 2, 3, 4]
[4, 3, 2, 1]
nonempty_cord(branch_node(unit_node(1), branch_node(unit_node(1), unit_node(1))))
[1, 1, 1]
[1, 1, 1]
nonempty_cord(branch_node(unit_node(1), branch_node(unit_node(1), list_node(2, [3, 4]))))
[1, 1, 2, 3, 4]
[4, 3, 2, 1, 1]
nonempty_cord(branch_node(unit_node(1), branch_node(list_node(2, [3, 4]), unit_node(1))))
[1, 2, 3, 4, 1]
[1, 4, 3, 2, 1]
nonempty_cord(branch_node(unit_node(1), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[1, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 1]
nonempty_cord(branch_node(list_node(2, [3, 4]), unit_node(1)))
[2, 3, 4, 1]
[1, 4, 3, 2]
nonempty_cord(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])))
[2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(list_node(2, [3, 4]), branch_node(unit_node(1), unit_node(1))))
[2, 3, 4, 1, 1]
[1, 1, 4, 3, 2]
nonempty_cord(branch_node(list_node(2, [3, 4]), branch_node(unit_node(1), list_node(2, [3, 4]))))
[2, 3, 4, 1, 2, 3, 4]
[4, 3, 2, 1, 4, 3, 2]
nonempty_cord(branch_node(list_node(2, [3, 4]), branch_node(list_node(2, [3, 4]), unit_node(1))))
[2, 3, 4, 2, 3, 4, 1]
[1, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(list_node(2, [3, 4]), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[2, 3, 4, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), unit_node(1)))
[1, 1, 1]
[1, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), list_node(2, [3, 4])))
[1, 1, 2, 3, 4]
[4, 3, 2, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), branch_node(unit_node(1), unit_node(1))))
[1, 1, 1, 1]
[1, 1, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), branch_node(unit_node(1), list_node(2, [3, 4]))))
[1, 1, 1, 2, 3, 4]
[4, 3, 2, 1, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), branch_node(list_node(2, [3, 4]), unit_node(1))))
[1, 1, 2, 3, 4, 1]
[1, 4, 3, 2, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), unit_node(1)), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[1, 1, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 1, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), unit_node(1)))
[1, 2, 3, 4, 1]
[1, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), list_node(2, [3, 4])))
[1, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), branch_node(unit_node(1), unit_node(1))))
[1, 2, 3, 4, 1, 1]
[1, 1, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), branch_node(unit_node(1), list_node(2, [3, 4]))))
[1, 2, 3, 4, 1, 2, 3, 4]
[4, 3, 2, 1, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), branch_node(list_node(2, [3, 4]), unit_node(1))))
[1, 2, 3, 4, 2, 3, 4, 1]
[1, 4, 3, 2, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(unit_node(1), list_node(2, [3, 4])), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[1, 2, 3, 4, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 4, 3, 2, 1]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), unit_node(1)))
[2, 3, 4, 1, 1]
[1, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), list_node(2, [3, 4])))
[2, 3, 4, 1, 2, 3, 4]
[4, 3, 2, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), branch_node(unit_node(1), unit_node(1))))
[2, 3, 4, 1, 1, 1]
[1, 1, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), branch_node(unit_node(1), list_node(2, [3, 4]))))
[2, 3, 4, 1, 1, 2, 3, 4]
[4, 3, 2, 1, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), branch_node(list_node(2, [3, 4]), unit_node(1))))
[2, 3, 4, 1, 2, 3, 4, 1]
[1, 4, 3, 2, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), unit_node(1)), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[2, 3, 4, 1, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 1, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), unit_node(1)))
[2, 3, 4, 2, 3, 4, 1]
[1, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), list_node(2, [3, 4])))
[2, 3, 4, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), branch_node(unit_node(1), unit_node(1))))
[2, 3, 4, 2, 3, 4, 1, 1]
[1, 1, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), branch_node(unit_node(1), list_node(2, [3, 4]))))
[2, 3, 4, 2, 3, 4, 1, 2, 3, 4]
[4, 3, 2, 1, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), branch_node(list_node(2, [3, 4]), unit_node(1))))
[2, 3, 4, 2, 3, 4, 2, 3, 4, 1]
[1, 4, 3, 2, 4, 3, 2, 4, 3, 2]
nonempty_cord(branch_node(branch_node(list_node(2, [3, 4]), list_node(2, [3, 4])), branch_node(list_node(2, [3, 4]), list_node(2, [3, 4]))))
[2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4]
[4, 3, 2, 4, 3, 2, 4, 3, 2, 4, 3, 2]
Test folds
done.
Test cord_list_to_cord and cord_list_to_list
done.