adt types implementations