:- module(bparrays, [new_array/2, a2_new/3, a3_new/4, is_array/1, '$aget'/3]).

:- use_module(library(lists), [flatten/2]).

new_array(X, Dim.Dims) :-
	     functor(X, '[]', Dim),
	     recurse_new_array(0, Dim, Dims, X).

recurse_new_array(_, _, [], _X) :- !.
recurse_new_array(Dim, Dim, _Dims, _X) :- !.
recurse_new_array(I0, Dim, Dims, X) :-
             I is I0+1,
	     arg(I, X, A),
             new_array(A, Dims),
	     recurse_new_array(0, Dim, Dims, X).

a2_new(X, Dim1, Dim2) :-
	     functor(X, '[]', Dim1),
	     recurse_new_array(0, Dim1, [Dim2], X).
	  
a2_new(X, Dim1, Dim2, Dim3) :-
	     functor(X, '.', Dim1),
	     recurse_new_array(0, Dim1, [Dim2,Dim3], X).

is_array(X) :-
	     functor(X, '[]', _Dim).

'$aget'(A,[],A).
'$aget'(A,I.Is,A) :-
	     arg(I, A, X),
             '$aget'(X,Is,A).

array_to_list(A, List) :-
	 flatten(A, List).