# How can one define a custom data object?

In Mathematica there are different objects like InterpolatingFunction or SparseArray? How can I define a custom data object with special data structure?

Example:

f = Interpolation[{1, 2, 3, 5, 8, 5}];
f // InputForm

returns us

InterpolatingFunction[{{1, 6}}, {4, 3, 0, {6}, {4}, 0, 0, 0, 0, Automatic},
{{1, 2, 3, 4, 5, 6}}, {{1}, {2}, {3}, {5}, {8}, {5}}, {Automatic}]

But if one evaluates the above output one gets back

InterpolatingFunction[{{1, 6}}, <>]

I could not find any documentation how to do it for any custom data object that I want to define for my program.

-

Format is what you are looking for: Create a data structure, something like this:

mkMyData[d1_, d2_] := MyData[d1, d2]
GetD1[a_MyData] := a[[1]]
GetD2[a_MyData] := a[[2]]
Format[MyData[d1_, d2_]] := "MyData[<" <> ToString[Length[d1] + Length[d2]] <> ">]"

Call the constructor:

data = mkMyData[Range[5], q]

(* "MyData[<5>]" *)

Call a selector:

GetD1[data]

(* {1, 2, 3, 4, 5} *)

-

As Michael Pilat explained here it is more robust to use MakeBoxes, rather than Format.

Using MakeBoxes:

MakeBoxes[diag[m_?MatrixQ], _] ^:=
InterpretationBox[RowBox[{"diag", "[", #, ",", #2, "]"}], diag[m]] & @@
ToBoxes /@ {Dimensions[m], Diagonal[m]}

Here is a definition for handling Part extraction:

diag[m_?MatrixQ][[part___]] ^:= m[[part]]

Result:

mat = DiagonalMatrix[{1, 2, 3, 4, 5}];

diag[mat]
diag[{5, 5}, {1, 2, 3, 4, 5}]
diag[mat][[2]]
{0, 2, 0, 0, 0}
-