Я сделал простую программу, чтобы увидеть скомпилированный вывод JS. С кодом Elm
type alias Color = { red: Int, green: Int, blue: Int }
black: Color
black = { red = 255, green = 255, blue = 255 }
white: Color
white = { red = 0, green = 0, blue = 0 }
red: Color
red = { red = 255, green = 0, blue = 0 }
colors: List Color
colors =
[
black,
white,
red,
{ red = 123, green = 234, blue = 11 },
black,
{ red = 123, green = 234, blue = 11 },
red,
{ red = 123, green = 234, blue = 11 }
]
Выходной код JS содержит
var author$project$SharedData$colors = _List_fromArray(
[
author$project$SharedData$black,
author$project$SharedData$white,
author$project$SharedData$red,
{blue: 11, green: 234, red: 123},
author$project$SharedData$black,
{blue: 11, green: 234, red: 123},
author$project$SharedData$red,
{blue: 11, green: 234, red: 123}
]);
Это показывает, что компилятор может повторно использовать предопределенные цвета черный, белый и красный, но когда при создании новой записи даже с точно такими же данными всегда будет дублирование.
Я не знаю, как организованы ваши данные, но в приведенном выше примере вместо попытки оптимизировать данные структура, я бы просто сохранил цвета в виде шестнадцатеричных строк кода.
Я не уверен на 100%, как движки JS обрабатывают строки, но на многих других платформах в куче одной строки есть только один экземпляр. Для вышеприведенного игрушечного приложения это будет означать использование "7BEA0B"
вместо { red: 123, green: 234, blue: 11 }