IOUQueue は、Data.Vector.Unboxed.Mutable を用いた Deque である。 大規模な BFS などを高速に実行することを意図して作成した。
ひとつ、または、複数の値を追加する関数に加え、 BFS では探索における距離などをタプルにして要素に付加することも多いことから、 [a] 型のリストと定数 b を引数にとって、(a, b) 型の要素を push する関数も用意した (pushBackListWithD / pushFrontListWithD)。
長さを指定して Deqeue を生成する。長さは足りなくなった場合に自動的に拡張される。
newUDeque :: (Unbox a) => Int -> IO (IOUQueue a)
Deque が空かどうかを判定する。戻り値は IO Bool ではなく Bool である点に注意。
nullUQ :: (Unbox a) => IOUQueue a -> Bool
Deque の長さを返す。戻り値は IO Int ではなく Int
lengthUQ :: (Unbox a) => IOUQueue a -> Int
Deque の長さを倍にする。push の際に必要に応じて用いられるので、 ユーザが直接用いる必要はない。
growUQ :: (Unbox a) => IOUQueue a -> IO (IOUQueue a)
Deque の先頭または末尾から要素をひとつ取り出す。
popFrontUQ :: (Unbox a) => IOUQueue a -> IO (IOUQueue a, a) popBackUQ :: (Unbox a) => IOUQueue a -> IO (IOUQueue a, a)
Deque の先頭または末尾に複数の要素をひとつ追加する。
pushFrontUQ :: (Unbox a) => IOUQueue a -> a -> IO (IOUQueue a) pushBackUQ :: (Unbox a) => IOUQueue a -> a -> IO (IOUQueue a)
Deque の先頭または末尾に複数の要素を複数追加する。
pushFrontListUQ :: (Unbox a) => IOUQueue a -> [a] -> IO (IOUQueue a) pushBackListUQ :: (Unbox a) => IOUQueue a -> [a] -> IO (IOUQueue a)
Deque の先頭または末尾に、定数を付加した要素を複数追加する。 [a] と b をとり、(a,b) 型の要素を複数追加する。
pushFrontListWithDUQ :: (Unbox a, Unbox b) => IOUQueue (a, b) -> [a] -> b -> IO (IOUQueue (a, b)) pushBackListWithDUQ :: (Unbox a, Unbox b) => IOUQueue (a, b) -> [a] -> b -> IO (IOUQueue (a, b))