mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-19 03:13:40 +00:00
47 lines
1.3 KiB
Mathematica
47 lines
1.3 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module flatten_conj_bug.
|
|
:- interface.
|
|
:- import_module list.
|
|
|
|
% A type
|
|
:- type cvar(T)
|
|
---> cvar(v :: T, x :: list(int)).
|
|
:- inst cvar
|
|
---> cvar(ground, non_empty_list).
|
|
|
|
% A typeclass.
|
|
:- typeclass cvar_type(T) where [].
|
|
|
|
:- type cvar_wrapper
|
|
---> some [T] (cvar_wrapper(cvar :: cvar(T)) => cvar_type(T)).
|
|
|
|
:- some [T] func unwrap_cvar(cvar_wrapper::in) = (cvar(T)::out(cvar)) is det
|
|
=> (cvar_type(T)).
|
|
|
|
:- implementation.
|
|
|
|
% The transformed version of this function was not able to be
|
|
% mode checked. The reason for this is that polymorphism was not
|
|
% flattening conjunctions, and the conjuncts were therefore not
|
|
% able to be scheduled in any order that would work.
|
|
%
|
|
unwrap_cvar(cvar_wrapper(V)) = unsafe_any_to_cvar(V).
|
|
|
|
:- func unsafe_any_to_cvar(cvar(T)::in) = (cvar(T)::out(cvar)) is det.
|
|
|
|
:- pragma foreign_proc("C",
|
|
unsafe_any_to_cvar(X::in) = (Y::out(cvar)),
|
|
[will_not_call_mercury, promise_pure],
|
|
"
|
|
Y = X;
|
|
").
|
|
:- pragma foreign_proc("Java",
|
|
unsafe_any_to_cvar(X::in) = (Y::out(cvar)),
|
|
[will_not_call_mercury, promise_pure],
|
|
"
|
|
Y = X;
|
|
").
|