123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119[@@@ocamlformat"disable"]moduleVector=Miou_vector(********************************************************************)(* *)(* The Why3 Verification Platform / The Why3 Development Team *)(* Copyright 2010-2023 -- Inria - CNRS - Paris-Saclay University *)(* *)(* This software is distributed under the terms of the GNU Lesser *)(* General Public License version 2.1, with the special exception *)(* on linking described in file LICENSE. *)(* *)(********************************************************************)(** This is OCaml code extracted from a verified WhyML implementation,
part of the VOCaL library.
See https://github.com/vocal-project/vocal/ *)(** This is a contribution by Aymeric Walch. *)moduleMake(X:sigtypetvaldummy:tvalcompare:t->t->intend)=structtypeelt=X.ttypet=X.tVector.tletcreate(_:unit):t=Vector.create?capacity:(Some0)~dummy:X.dummy()letis_empty(h:t):bool=Vector.is_emptyhletsize(h:t):int=Vector.lengthhexceptionEmptyletfind_min_exn(h:t):X.t=beginifVector.is_emptyhthenbeginraiseEmptyend;Vector.geth0endletfind_min(h:t):X.toption=ifVector.is_emptyhthenbeginNoneendelsebeginSome(Vector.geth0)endletrecmove_down(a:X.tVector.t)(i:int)(x:X.t):unit=letn=Vector.lengthainletq=ifn=1thenbegin(-1)endelsebegin(n-2)/2endinifi<=qthenbeginletj=letj1=(2*i)+1inif((j1+1)<n)&&((X.compare(Vector.geta(j1+1))(Vector.getaj1))<0)thenbeginj1+1endelsebeginj1endinif(X.compare(Vector.getaj)x)<0thenbeginbeginleto=Vector.getajinVector.setaio;move_downajxendendelsebeginVector.setaixendendelsebeginVector.setaixendletextract_min_exn(h:t):X.t=begintryletx=Vector.pophinletn=Vector.lengthhinifnot(n=0)thenbeginletmin=Vector.geth0inbeginmove_downh0x;minendendelsebeginxendwith|Vector.Empty->raiseEmptyendletdelete_min_exn(h:t):unit=ignore(extract_min_exnh)letrecmove_up(a:X.tVector.t)(i:int)(x:X.t):unit=ifi=0thenbeginVector.setaixendelsebeginletj=(i-1)/2inlety=Vector.getajinif(X.compareyx)>0thenbeginbeginVector.setaiy;move_upajxendendelsebeginVector.setaixendendletinsert(x:X.t)(h:t):unit=beginif(sizeh)=Sys.max_array_lengththenbeginraise(Invalid_argument"")end;letn=Vector.lengthhinifn=0thenbeginVector.pushhxendelsebeginletj=(n-1)/2inlety=Vector.gethjinif(X.compareyx)>0thenbeginbeginVector.pushhy;move_uphjxendendelsebeginVector.pushhxendendendletiterf(h:t)=Vector.iterfhend