(* box 1 *)
module List_stack :
(* public *)
sig
exception Empty_stack
type 'a t
val push
: 'a
-> 'a t
-> unit val pop : 'a t -> 'a
end = struct
exception Empty_stack
let make () = ref []
let push x st =
st := x :: !st
let pop st =
match !st with
| [] -> raise Empty_stack
| head :: rest ->
begin
st := rest ;
head
end
end
(* box 2 *)
module Array_stack :
(* public *)
sig
exception Empty_stack
type 'a t
val push
: 'a
-> 'a t
-> unit val pop : 'a t -> 'a
end = struct
(* public impl *)
exception Empty_stack
type 'a t =
{ mutable items
: 'a
option array }
(* private *)
let grow_factor = 1.6
let init_capacity = 10
let grow src =
let old_cap
= Array.length src
in let dst
= Array.make new_cap None
in Array.blit src
0 dst
0 old_cap
; dst
let ensure_cap s =
if s
.count
< Array.length s
.items
then ()
else s.items <- grow s.items
(* public impl *)
let make () =
{ items
= Array.make init_capacity None
; count = 0
}
let push x s =
ensure_cap s ;
Array.set s
.items s
.count
(Some x
) ; s.count <- s.count + 1
let pop s =
if s.count = 0
then raise Empty_stack
else
s.count <- s.count - 1 ;
match Array.get s
.items s
.count
with | None
-> raise (Failure "unreachable") | Some x ->
begin
Array.set s
.items s
.count None
; x
end
end
(* interface *)
sig
exception Empty_stack
type 'a t
val push
: 'a
-> 'a t
-> unit val pop : 'a t -> 'a
end
(* box 3 *)
struct
let main () =
for i = 1 to 3 do
done ;
for i = 1 to 3 do
done ;
end
let _ =
let module M1 = Main (List_stack) in
let module M2 = Main (Array_stack) in
M1.main () ;
M2.main ()
KCogYm94IDEgKikKbW9kdWxlIExpc3Rfc3RhY2sgOgogICgqIHB1YmxpYyAqKQogIHNpZwogICAgZXhjZXB0aW9uIEVtcHR5X3N0YWNrCiAgICB0eXBlICdhIHQKICAgIHZhbCBtYWtlIDogdW5pdCAtPiAnYSB0CiAgICB2YWwgcHVzaCA6ICdhIC0+ICdhIHQgLT4gdW5pdAogICAgdmFsIHBvcCAgOiAnYSB0IC0+ICdhCiAgZW5kID0gc3RydWN0CgogICAgZXhjZXB0aW9uIEVtcHR5X3N0YWNrCgogICAgdHlwZSAnYSB0ID0gJ2EgbGlzdCByZWYKCiAgICBsZXQgbWFrZSAoKSA9IHJlZiBbXQoKICAgIGxldCBwdXNoIHggc3QgPQogICAgICBzdCA6PSB4IDo6ICFzdAoKICAgIGxldCBwb3Agc3QgPQogICAgICBtYXRjaCAhc3Qgd2l0aAogICAgICB8IFtdIC0+IHJhaXNlIEVtcHR5X3N0YWNrCiAgICAgIHwgaGVhZCA6OiByZXN0IC0+CiAgICAgICAgYmVnaW4KICAgICAgICAgIHN0IDo9IHJlc3QgOwogICAgICAgICAgaGVhZAogICAgICAgIGVuZAoKICBlbmQKCgoKKCogYm94IDIgKikKbW9kdWxlIEFycmF5X3N0YWNrIDoKICAoKiBwdWJsaWMgKikKICBzaWcKICAgIGV4Y2VwdGlvbiBFbXB0eV9zdGFjawogICAgdHlwZSAnYSB0CiAgICB2YWwgbWFrZSA6IHVuaXQgLT4gJ2EgdAogICAgdmFsIHB1c2ggOiAnYSAtPiAnYSB0IC0+IHVuaXQKICAgIHZhbCBwb3AgIDogJ2EgdCAtPiAnYQogIGVuZCA9IHN0cnVjdAoKICAgICgqIHB1YmxpYyBpbXBsICopCgogICAgZXhjZXB0aW9uIEVtcHR5X3N0YWNrCgogICAgdHlwZSAnYSB0ID0KICAgICAgeyBtdXRhYmxlIGl0ZW1zIDogJ2Egb3B0aW9uIGFycmF5CiAgICAgIDsgbXV0YWJsZSBjb3VudCA6IGludAogICAgICB9CgogICAgKCogcHJpdmF0ZSAqKQoKICAgIGxldCBncm93X2ZhY3RvciA9IDEuNgogICAgbGV0IGluaXRfY2FwYWNpdHkgPSAxMAoKICAgIGxldCBncm93IHNyYyA9CiAgICAgIGxldCBvbGRfY2FwID0gQXJyYXkubGVuZ3RoIHNyYyBpbgogICAgICBsZXQgbmV3X2NhcCA9IGludF9vZl9mbG9hdCAoZ3Jvd19mYWN0b3IgKi4gZmxvYXRfb2ZfaW50IG9sZF9jYXApIGluCiAgICAgIGxldCBkc3QgPSBBcnJheS5tYWtlIG5ld19jYXAgTm9uZSBpbgogICAgICBBcnJheS5ibGl0IHNyYyAwIGRzdCAwIG9sZF9jYXAgOwogICAgICBkc3QKCiAgICBsZXQgZW5zdXJlX2NhcCBzID0KICAgICAgaWYgcy5jb3VudCA8IEFycmF5Lmxlbmd0aCBzLml0ZW1zCiAgICAgIHRoZW4gKCkKICAgICAgZWxzZSBzLml0ZW1zIDwtIGdyb3cgcy5pdGVtcwoKICAgICgqIHB1YmxpYyBpbXBsICopCgogICAgbGV0IG1ha2UgKCkgPQogICAgICB7IGl0ZW1zID0gQXJyYXkubWFrZSBpbml0X2NhcGFjaXR5IE5vbmUKICAgICAgOyBjb3VudCA9IDAKICAgICAgfQoKICAgIGxldCBwdXNoIHggcyA9CiAgICAgIGVuc3VyZV9jYXAgcyA7CiAgICAgIEFycmF5LnNldCBzLml0ZW1zIHMuY291bnQgKFNvbWUgeCkgOwogICAgICBzLmNvdW50IDwtIHMuY291bnQgKyAxCgogICAgbGV0IHBvcCBzID0KICAgICAgaWYgcy5jb3VudCA9IDAKICAgICAgdGhlbiByYWlzZSBFbXB0eV9zdGFjawogICAgICBlbHNlCiAgICAgICAgcy5jb3VudCA8LSBzLmNvdW50IC0gMSA7CiAgICAgICAgbWF0Y2ggQXJyYXkuZ2V0IHMuaXRlbXMgcy5jb3VudCB3aXRoCiAgICAgICAgfCBOb25lICAgLT4gcmFpc2UgKEZhaWx1cmUgInVucmVhY2hhYmxlIikKICAgICAgICB8IFNvbWUgeCAtPgogICAgICAgICAgYmVnaW4KICAgICAgICAgICAgQXJyYXkuc2V0IHMuaXRlbXMgcy5jb3VudCBOb25lIDsKICAgICAgICAgICAgeAogICAgICAgICAgZW5kCgogIGVuZAoKCgooKiBpbnRlcmZhY2UgKikKbW9kdWxlIHR5cGUgU3RhY2sgPQogIHNpZwogICAgZXhjZXB0aW9uIEVtcHR5X3N0YWNrCiAgICB0eXBlICdhIHQKICAgIHZhbCBtYWtlIDogdW5pdCAtPiAnYSB0CiAgICB2YWwgcHVzaCA6ICdhIC0+ICdhIHQgLT4gdW5pdAogICAgdmFsIHBvcCAgOiAnYSB0IC0+ICdhCiAgZW5kCgoKCigqIGJveCAzICopCm1vZHVsZSBNYWluIChTdGFjayA6IFN0YWNrKSA9CiAgc3RydWN0CgogICAgbGV0IG1haW4gKCkgPQogICAgICBsZXQgcyA9IFN0YWNrLm1ha2UgKCkgaW4KICAgICAgZm9yIGkgPSAxIHRvIDMgZG8KICAgICAgICBTdGFjay5wdXNoIGkgcwogICAgICBkb25lIDsKICAgICAgZm9yIGkgPSAxIHRvIDMgZG8KICAgICAgICBTdGFjay5wb3AgcyB8PiBQcmludGYucHJpbnRmICIlZCAiCiAgICAgIGRvbmUgOwogICAgICBQcmludGYucHJpbnRmICJcbiIKCiAgZW5kCgpsZXQgXyA9CiAgbGV0IG1vZHVsZSBNMSA9IE1haW4gKExpc3Rfc3RhY2spIGluCiAgbGV0IG1vZHVsZSBNMiA9IE1haW4gKEFycmF5X3N0YWNrKSBpbgogIE0xLm1haW4gKCkgOwogIE0yLm1haW4gKCkK