Skip to content

Instantly share code, notes, and snippets.

@busypeoples
Last active July 31, 2018 23:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save busypeoples/fb714cde0e05404eb4ab1873529bc8e5 to your computer and use it in GitHub Desktop.
Save busypeoples/fb714cde0e05404eb4ab1873529bc8e5 to your computer and use it in GitHub Desktop.
Data Structures in ReasonML: #9 Queue
/* Queue */
/* FIFO: First In First Out*/
exception Empty;
module type Queue = {
type queue('a) = list('a);
let create: unit => queue('a);
let add: ('a, queue('a)) => queue('a);
let delete: queue('a) => queue('a);
let peak: queue('a) => 'a;
let isEmpty: queue('a) => bool;
let length: queue('a) => int;
let map: ('a => 'b, queue('a)) => queue('b);
let iter: ('a => unit, queue('a)) => unit;
};
module Queue: Queue = {
/* We can implement the queue with a list*/
type queue('a) = list('a);
/* Initialize an empty queue */
let create = () => [];
/* A new queue with the item added at the end of the queue */
let add = (value, queue) => List.append(queue, [value]);
/* A new queue with an item removed from the top of queue */
let delete = queue =>
switch (queue) {
| [_head, ...rest] => rest
| [] => raise(Empty)
};
/* Access the item at the top of the queue */
let peak = queue =>
switch (queue) {
| [head, ..._rest] => head
| [] => raise(Empty)
};
let length = queue => List.length(queue);
let isEmpty = queue =>
switch (queue) {
| [] => true
| _ => false
};
/* Return a new queue by applying the
mapping function on every item in the queue */
let map = (fn, queue) => List.map(fn, queue);
/* Applies the provided function on every item in the queue */
let iter = (fn, queue) => List.iter(fn, queue);
};
let run = () => {
let q = Queue.create();
let q = Queue.add(1, q);
let q = Queue.add(2, q);
let q = Queue.add(4, q);
Js.log("Log values");
Queue.iter(a => Js.log2("logged value: ", a), q);
Js.log("peak: ");
Js.log(Queue.peak(q));
let q = Queue.add(20, q);
Js.log("peak: ");
Js.log(Queue.peak(q));
Js.log("delete");
let q = Queue.delete(q);
Js.log("map: a => a * 2: ");
let q = Queue.map(a => a * 2, q);
Js.log("Log values");
Queue.iter(a => Js.log2("logged value: ", a), q);
Js.log("peak: ");
Js.log(Queue.peak(q));
Js.log("isEmpty? ");
Js.log(Queue.isEmpty(q));
Js.log("length: ");
Js.log(Queue.length(q));
};
run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment