-module(simple2_api).
-export([c1/2, c2/0, c3/0, c4/1, c5/1, c6/0, c6_b/0, c7/0, c7_b/0,
c7_c/0, c8/0, c9/0, c10/0, c11/0, c12/0, c13/0, c14/0, c15/0,
c16/0, c17/0, c18/0, c19/0, c20/0, c21/0, c22/0, c23/0,
c24/0, c25/0, c26/0]).
-spec c1(simple1_adt:d1(), simple1_adt:d2()) -> boolean().
c1(A, B) ->
{A} =< {B}. % succ type of A and B is any()
c2() ->
A = simple1_adt:d1(),
erlang:make_tuple(1, A). % ok
c3() ->
A = simple1_adt:d1(),
setelement(1, {A}, A). % ok
c4(_) ->
A = simple1_adt:d1(),
halt(A). % ok (BIF fails...)
c5(_) ->
A = simple1_adt:d1(),
[A] -- [A]. % ok
c6() ->
A = simple1_adt:d1(),
A ! foo. % opaque term
c6_b() ->
A = simple1_adt:d1(),
erlang:send(A, foo). % opaque term
c7() ->
A = simple1_adt:d1(),
foo ! A. % ok
c7_b() ->
A = simple1_adt:d1(),
erlang:send(foo, A). % ok
c7_c() ->
A = simple1_adt:d1(),
erlang:send(foo, A, []). % ok
c8() ->
A = simple1_adt:d1(),
A < 3. % opaque term
c9() ->
A = simple1_adt:d1(),
lists:keysearch(A, 1, []). % ok
c10() ->
A = simple1_adt:d1(),
lists:keysearch(1, A, []). % opaque term 2
c11() ->
A = simple1_adt:tuple(),
lists:keysearch(key, 1, [A]). % ok
c12() ->
A = simple1_adt:tuple(),
lists:keysearch(key, 1, A). % opaque term 3
c13() ->
A = simple1_adt:tuple(),
lists:keysearch(key, 1, [{A,2}]). % ok
c14() ->
A = simple1_adt:tuple(),
lists:keysearch(key, 1, [{2,A}]). % ok
c15() ->
A = simple1_adt:d1(),
lists:keysearch(key, 1, [A]). % ok
c16() ->
A = simple1_adt:tuple(),
erlang:send(foo, A). % ok
c17() ->
A = simple1_adt:tuple(),
lists:reverse([A]). % ok
c18() ->
A = simple1_adt:tuple(),
lists:keyreplace(a, 1, [A], {1,2}). % ok
c19() ->
A = simple1_adt:tuple(),
%% Problem. The spec says argument 4 is a tuple(). Fix that!
lists:keyreplace(a, 1, [{1,2}], A). % opaque term 4
c20() ->
A = simple1_adt:tuple(),
lists:flatten(A). % opaque term 1
c21() ->
A = simple1_adt:tuple(),
lists:flatten([[{A}]]). % ok
c22() ->
A = simple1_adt:tuple(),
lists:flatten([[A]]). % ok
c23() ->
A = simple1_adt:tuple(),
lists:flatten([A]). % ok
c24() ->
A = simple1_adt:tuple(),
lists:flatten({A}). % will never return
c25() ->
A = simple1_adt:d1(),
B = simple1_adt:tuple(),
if {A,3} > {A,B} -> true end. % opaque 2nd argument
c26() ->
B = simple1_adt:tuple(),
tuple_to_list(B). % opaque term 1