(* BSD 2-Clause License Copyright (c) 2018, Anton Krotov All rights reserved. *) MODULE COLLECTIONS; TYPE ITEM* = POINTER TO RECORD link: ITEM END; COLLECTION* = POINTER TO RECORD last: ITEM END; PROCEDURE push* (collection: COLLECTION; item: ITEM); BEGIN item.link := collection.last; collection.last := item END push; PROCEDURE pop* (collection: COLLECTION): ITEM; VAR item: ITEM; BEGIN item := collection.last; IF item # NIL THEN collection.last := item.link END RETURN item END pop; PROCEDURE create* (): COLLECTION; VAR collection: COLLECTION; BEGIN NEW(collection); collection.last := NIL RETURN collection END create; END COLLECTIONS.