mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-19 03:13:40 +00:00
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.
125 lines
5.3 KiB
Plaintext
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.
|