mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 01:43:35 +00:00
80 lines
1.9 KiB
Mathematica
80 lines
1.9 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module cqueue.
|
|
|
|
:- interface.
|
|
|
|
:- type cqueue(T).
|
|
|
|
:- pred cqueue.cqueue(cqueue(T)).
|
|
:- mode cqueue.cqueue(out) is det.
|
|
|
|
:- pred cqueue.insert(cqueue(T), T, cqueue(T)).
|
|
:- mode cqueue.insert(in, in, out) is det.
|
|
|
|
:- pred cqueue.append(cqueue(T), T, cqueue(T)).
|
|
:- mode cqueue.append(in, in, out) is det.
|
|
|
|
:- pred cqueue.this(cqueue(T), T).
|
|
:- mode cqueue.this(in, out) is semidet.
|
|
|
|
:- pred cqueue.next(cqueue(T), cqueue(T)).
|
|
:- mode cqueue.next(in, out) is det.
|
|
|
|
:- pred cqueue.prev(cqueue(T), cqueue(T)).
|
|
:- mode cqueue.prev(in, out) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module list.
|
|
:- import_module pair.
|
|
|
|
:- type cqueue(T) == pair(list(T)).
|
|
|
|
cqueue.cqueue([] - []).
|
|
|
|
cqueue.insert([Thing | Before] - After, New, [Thing, New | Before] - After).
|
|
cqueue.insert([] - After0, New, Before - After) :-
|
|
list.reverse(After0, Before0),
|
|
(
|
|
Before0 = [],
|
|
Before = [New],
|
|
After = []
|
|
;
|
|
Before0 = [Thing | Before1],
|
|
Before = [Thing, New | Before1],
|
|
After = []
|
|
).
|
|
|
|
cqueue.append(Before - After, New, Before - [New | After]).
|
|
|
|
cqueue.this([This | _Before] - _After, This).
|
|
cqueue.this([] - After, This) :-
|
|
list.reverse(After, [This | _Before]).
|
|
|
|
cqueue.next(Before - [Thing | After], [Thing | Before] - After).
|
|
cqueue.next(Before0 - [], Before - After) :-
|
|
list.reverse(Before0, After0),
|
|
(
|
|
After0 = [],
|
|
Before = [],
|
|
After = []
|
|
;
|
|
After0 = [Thing | After],
|
|
Before = [Thing]
|
|
).
|
|
|
|
cqueue.prev([Thing | Before] - After, Before - [Thing | After]).
|
|
cqueue.prev([] - After0, Before - After) :-
|
|
list.reverse(After0, Before0),
|
|
(
|
|
Before0 = [],
|
|
After = [],
|
|
Before = []
|
|
;
|
|
Before0 = [Thing | Before],
|
|
After = [Thing]
|
|
).
|