Advertisement
Guest User

queues

a guest
Nov 25th, 2015
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. signature QUEUE =
  2. sig
  3.   type 'a queue
  4.  
  5.   val empty : 'a queue
  6.   val cons : 'a * 'a queue -> 'a queue
  7.   val snoc : 'a queue * 'a -> 'a queue
  8.   val uncons : 'a queue -> ('a * 'a queue Lazy.lazy) option
  9. end
  10.  
  11. structure BatchedQueue :> QUEUE =
  12. struct
  13.   type 'a queue = 'a list * 'a list
  14.  
  15.   val empty = (nil, nil)
  16.  
  17.   fun check (nil, xs) = (rev xs, nil)
  18.     | check xs = xs
  19.  
  20.   fun cons (x, (xs, ys)) = (x :: xs, ys)
  21.   fun snoc ((xs, ys), y) = check (xs, y :: ys)
  22.  
  23.   fun uncons (nil, _) = NONE
  24.     | uncons (x :: xs, ys) = SOME (x, Lazy.delay check (xs, ys))
  25. end
  26.  
  27. structure RealTimeQueue :> QUEUE =
  28. struct
  29.   structure L = Lazy
  30.   structure S = Stream
  31.  
  32.   type 'a queue = 'a S.front * 'a list * 'a S.front
  33.  
  34.   val empty = (S.Nil, nil, S.Nil)
  35.  
  36.   fun rotate (xs, nil, zs) = S.concat (xs, zs)
  37.     | rotate (S.Nil, ys, zs) = S.reverse (ys, zs)
  38.     | rotate (S.Cons (x, xs), y :: ys, zs) =
  39.       let
  40.         val xs = L.force xs
  41.         val zs = S.Cons (y, L.pure zs)
  42.       in
  43.         S.Cons (x, L.delay rotate (xs, ys, zs))
  44.       end
  45.  
  46.   fun exec (xs, ys, S.Cons (_, zs)) = (xs, ys, L.force zs)
  47.     | exec xs = let val xs = rotate xs in (xs, nil, xs) end
  48.  
  49.   fun cons (x, (xs, ys, zs)) = (S.Cons (x, L.pure xs), ys, zs)
  50.   fun snoc ((xs, ys, zs), y) = exec (xs, y :: ys, zs)
  51.  
  52.   fun uncons (S.Nil, _, _) = NONE
  53.     | uncons (S.Cons (x, xs), ys, zs) =
  54.       SOME (x, L.map (fn xs => exec (xs, ys, zs)) xs)
  55. end
  56.  
  57. signature CATENABLE =
  58. sig
  59.   type 'a cat
  60.  
  61.   val empty : 'a cat
  62.   val pure : 'a -> 'a cat
  63.   val concat : 'a cat * 'a cat -> 'a cat
  64.   val uncons : 'a cat -> ('a * 'a cat Lazy.lazy) option
  65. end
  66.  
  67. functor Catenable (Q : QUEUE) :> CATENABLE =
  68. struct
  69.   structure L = Lazy
  70.  
  71.   datatype 'a cons = ::: of 'a * 'a cons L.lazy Q.queue
  72.  
  73.   infixr 5 :::
  74.  
  75.   fun link (x ::: xs, ys) = x ::: Q.snoc (xs, ys)
  76.  
  77.   fun linkAll (xs, ys) =
  78.     let
  79.       val xs = L.force xs
  80.       val ys = L.force ys
  81.     in
  82.       case Q.uncons ys of
  83.           NONE => xs
  84.         | SOME ys => link (xs, L.delay linkAll ys)
  85.     end
  86.  
  87.   type 'a cat = 'a cons option
  88.  
  89.   val empty = NONE
  90.   fun pure x = SOME (x ::: Q.empty)
  91.  
  92.   fun concat (xs, NONE) = xs
  93.     | concat (NONE, ys) = ys
  94.     | concat (SOME xs, SOME ys) = SOME (link (xs, L.pure ys))
  95.  
  96.   fun uncons NONE = NONE
  97.     | uncons (SOME (x ::: xs)) =
  98.       SOME (x, L.delay (Option.map linkAll o Q.uncons) xs)
  99. end
  100.  
  101. functor CatQueue (C : CATENABLE) : QUEUE =
  102. struct
  103.   type 'a queue = 'a C.cat
  104.  
  105.   val empty = C.empty
  106.   fun cons (x, xs) = C.concat (C.pure x, xs)
  107.   fun snoc (xs, x) = C.concat (xs, C.pure x)
  108.   fun uncons xs = C.uncons xs
  109. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement