{ :list_insertion_on_heap :list_insertion_on_stack :list_insertion list_insertion_on_heap } Where Define (list_insertion_on_heap compare input) Define (insert sorted a) Iterate {left right} From {'nil sorted} Match right { | 'nil (LIST.reverse [a & left]) | 'cons.{b right_tail} If Pattern 'less Matches (compare a b) (LIST.reverse_append left [a & right]) (Continue [b & left] right_tail) } In (LIST.reduce input 'nil insert) Define (list_insertion_on_stack compare input) Define (insert sorted a) Unfold sorted Match sorted { | 'nil [a & 'nil] | 'cons.{b sorted_tail} If Pattern 'less Matches (compare a b) [a & sorted] [b & (Fold sorted_tail)] } In (LIST.reduce input 'nil insert) Where Open LIST {:Infix &} Where Let LIST Package "list"