# HG changeset patch # User Chris Cannam # Date 1663174909 -3600 # Wed Sep 14 18:01:49 2022 +0100 # Node ID fdabfb38085a541f6076cb4f051cdd33c44c10b9 # Parent 0299b00a7d3a6707c2c779228e16bebef9ab7526 Add peeks to accompany pops diff --git a/persistent-array.sig b/persistent-array.sig --- a/persistent-array.sig +++ b/persistent-array.sig @@ -41,5 +41,6 @@ val isEmpty : 'a array -> bool val append : 'a array * 'a -> 'a array val popEnd : 'a array -> 'a array * 'a + val peekEnd : 'a array -> 'a end diff --git a/persistent-array.sml b/persistent-array.sml --- a/persistent-array.sml +++ b/persistent-array.sml @@ -43,13 +43,18 @@ fun popEnd (A { size, trie }) = case T.find (trie, size - 0w1) of - NONE => raise Size + NONE => raise Empty | SOME x => let val t = T.remove (trie, size - 0w1) in (A { size = size - 0w1, trie = t }, x) end + fun peekEnd (A { size, trie }) = + case T.find (trie, size - 0w1) of + NONE => raise Empty + | SOME x => x + fun sub (v as A { size, trie }, i) = if i < 0 orelse i >= length v then raise Subscript diff --git a/persistent-queue.sig b/persistent-queue.sig --- a/persistent-queue.sig +++ b/persistent-queue.sig @@ -25,11 +25,13 @@ val isEmpty : 'a queue -> bool val append : 'a queue * 'a -> 'a queue val popEnd : 'a queue -> 'a queue * 'a + val peekEnd : 'a queue -> 'a (* II. Functions specific to PERSISTENT_QUEUE *) val queue : int * 'a -> 'a queue val prepend : 'a queue * 'a -> 'a queue val popStart : 'a queue -> 'a queue * 'a + val peekStart : 'a queue -> 'a end diff --git a/persistent-queue.sml b/persistent-queue.sml --- a/persistent-queue.sml +++ b/persistent-queue.sml @@ -33,12 +33,17 @@ fun popStart ({ start, size, trie } : 'a queue) : ('a queue * 'a) = case T.find (trie, start) of - NONE => raise Size + NONE => raise Empty | SOME x => let val t = T.remove (trie, start) in ({ start = start + 0w1, size = size - 0w1, trie = t }, x) end + + fun peekStart ({ start, size, trie } : 'a queue) : 'a = + case T.find (trie, start) of + NONE => raise Empty + | SOME x => x fun append ({ start, size, trie }, x) = let val _ = if size = maxLenW then raise Size else () @@ -49,13 +54,18 @@ fun popEnd ({ start, size, trie } : 'a queue) : ('a queue * 'a) = case T.find (trie, start + size - 0w1) of - NONE => raise Size + NONE => raise Empty | SOME x => let val t = T.remove (trie, start + size - 0w1) in ({ start = start, size = size - 0w1, trie = t }, x) end + fun peekEnd ({ start, size, trie } : 'a queue) : 'a = + case T.find (trie, start + size - 0w1) of + NONE => raise Empty + | SOME x => x + fun sub (v as { start, size, trie }, i) = if i < 0 orelse i >= length v then raise Subscript