Definition flatten := foldr cat (Nil T).Definition shape := map (@size T).Fixpoint reshape sh s :=
  if sh is n :: sh' then take n s :: reshape sh' (drop n s) else [::].Definition flatten_index sh r c := sumn (take r sh) + c.Definition reshape_offset sh i := i - sumn (take (reshape_index sh i) sh).

Lemma reshape_rcons s sh n (m := sumn sh) : m + n = size s -> reshape (rcons sh n) s = rcons (reshape sh (take m s)) (drop m s).