package body Tail_Call_P is function Start_Side (Element : T) return Index is begin if Element = 1 then raise Program_Error; end if; if Element = 0 then return Second; else return First; end if; end; function Segment (Element : T) return T is begin if Element /= 0 then raise Program_Error; end if; return 1; end; procedure Really_Insert (Into : T; Element : T; Value : T) is begin if Into /= 0 then raise Program_Error; end if; end; procedure Insert (Into : A; Element : T; Value : T) is begin Really_Insert (Into (Start_Side (Element)), Segment (Element), Value); end Insert; end Tail_Call_P;