2 * 2004 Matthew
Fluet (mfluet@acm
.org
)
3 * Ported to MLton threads
.
6 structure FunQueue
: FUN_QUEUE
=
8 datatype 'a t
= T
of {front
: 'a list
, back
: 'a list
}
11 fun filterPrefix (xs
, p
) =
15 then filterPrefix (ys
, p
)
17 fun filter (xs
, p
) = List.filter (not
o p
) xs
18 fun filterRevAcc ((xs
, zs
), p
) =
22 then filterRevAcc ((ys
, zs
), p
)
23 else filterRevAcc ((ys
, y
::zs
), p
)
24 fun filterRev (xs
, p
) = filterRevAcc ((xs
, []), p
)
26 fun cleanPrefix (T
{front
, back
}, p
) =
27 (case filterPrefix (front
, p
) of
28 [] => T
{front
= filterPrefix (List.rev(back
), p
),
30 | front
' => T
{front
= front
',
32 fun clean (T
{front
, back
}, p
) =
33 (case filter (front
, p
) of
34 [] => T
{front
= filterRev (back
, p
),
36 | front
' => T
{front
= front
',
37 back
= filter (back
, p
)})
38 fun cleanAndDeque (T
{front
, back
}, p
) =
39 (case filter (front
, p
) of
40 [] => (case filterRev(back
, p
) of
44 | x
::front
' => (SOME x
,
48 T
{front
= filterRev (back
, p
),
50 | x
::front
' => (SOME x
,
52 back
= filter (back
, p
)}))
55 fun deque (T
{front
, back
}) =
59 | l
=> let val l
= List.rev l
62 [] => raise Fail
"FunQueue.deque:impossible"
68 | x
::front
' => SOME (x
, T
{front
= front
', back
= back
}))
70 fun empty (T
{front
, back
}) =
77 fun enque (T
{front
, back
, ...}, x
) =
78 T
{front
= front
, back
= x
::back
}
80 fun enqueAndClean (q
, y
, p
) =
81 clean (enque (q
, y
), p
)
83 fun new () = T
{front
= [], back
= []}
85 fun peek (T
{front
, back
}) =
89 | l
=> let val l
= List.rev l
92 [] => raise Fail
"FunQueue.peek:impossible"