urweb-dequeue

August 10, 2015 ยท View on GitHub

Split list dequeue

datatype t a = Deq of (list a * list a)

(* construct *)
fun cons[a]: a -> t a -> t a = fn x (Deq (l, r)) => Deq (x :: l, r)
fun snoc[a]: t a -> a -> t a = fn (Deq (l, r)) x => Deq (l, x :: r)

(* deconstruct *)
fun viewL[a]: t a -> option (a * t a) = ...
fun viewR[a]: t a -> option (t a * a) = ...

(* import/export *)
fun fromList[a]: list a -> t a = fn li =>
     case li of
         [] => Deq ([], [])
         | _ => let val (prefix, suffix) = L.splitAt (L.length li `divide` 2) li
                in Deq (prefix, L.rev suffix)
                end

val toList[a]: t a -> list a = fn (Deq (l, r)) => l `L.append` (L.rev r)
...

test task

tests lib/test/deq_UnitTest UrUnit assertions

urweb test1
./test1.exe -p 8082
browser http://localhost:8082

Every browser page refresh brings different random input data