Files
mercury/tests/hard_coded/cqueue.m
2020-10-04 13:20:42 +11:00

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]
).