/** * Prices section builders * * Structure (single cohort): * - Compare: Both prices on one chart * - Realized: Price + Ratio (MVRV) * - Capitalized: Price + Ratio * * Structure (grouped cohorts): * - Realized: Price + Ratio comparison across cohorts * - Capitalized: Price + Ratio comparison across cohorts * * Cohorts without percentile patterns use basic Price/Ratio charts. */ import { colors } from "../../utils/colors.js"; import { mapCohortsWithAll } from "../shared.js"; import { baseline, price } from "../series.js"; import { Unit } from "../../utils/units.js"; /** * Create prices section for cohorts with full ratio patterns * (CohortAll, CohortFull, CohortLongTerm) * @param {{ cohort: CohortAll | CohortFull | CohortLongTerm, title: (name: string) => string }} args * @returns {PartialOptionsGroup} */ export function createPricesSectionFull({ cohort, title }) { const { tree, color } = cohort; return { name: "Prices", tree: [ { name: "Compare", title: title("Realized Prices"), top: [ price({ series: tree.realized.price, name: "Realized", color: colors.realized }), price({ series: tree.realized.capitalized.price, name: "Capitalized", color: colors.capitalized }), ], }, { name: "Realized", title: title("Realized Price"), top: [ price({ series: tree.realized.price, name: "Realized", color, }), ], bottom: [ baseline({ series: tree.realized.price.ratio, name: "Ratio", unit: Unit.ratio, base: 1, }), ], }, { name: "Capitalized", title: title("Capitalized Price"), top: [ price({ series: tree.realized.capitalized.price, name: "Capitalized", color, }), ], bottom: [ baseline({ series: tree.realized.capitalized.price.ratio, name: "Ratio", unit: Unit.ratio, base: 1, }), ], }, ], }; } /** * Create prices section for cohorts with basic ratio patterns only * (CohortCore, CohortBasic, CohortAddr, CohortWithoutRelative) * @param {{ cohort: CohortCore | CohortBasic | CohortAddr | CohortWithoutRelative | CohortAgeRange, title: (name: string) => string }} args * @returns {PartialOptionsGroup} */ export function createPricesSectionBasic({ cohort, title }) { const { tree, color } = cohort; return { name: "Prices", tree: [ { name: "Realized", title: title("Realized Price"), top: [ price({ series: tree.realized.price, name: "Realized", color, }), ], bottom: [ baseline({ series: tree.realized.price.ratio, name: "Ratio", unit: Unit.ratio, base: 1, }), ], }, ], }; } /** * Create prices section for grouped cohorts * @param {{ list: readonly CohortObject[], all: CohortAll, title: (name: string) => string }} args * @returns {PartialOptionsGroup} */ /** * @param {readonly CohortWithRealizedPrice[]} list * @param {CohortAll} all * @param {(name: string) => string} title * @returns {PartialOptionsTree} */ function groupedRealizedPriceItems(list, all, title) { return [ { name: "Realized", tree: [ { name: "Price", title: title("Realized Price"), top: mapCohortsWithAll(list, all, ({ name, color, tree }) => price({ series: tree.realized.price, name, color }), ), }, { name: "Ratio", title: title("Realized Price Ratio"), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => baseline({ series: tree.realized.mvrv, name, color, unit: Unit.ratio, base: 1 }), ), }, ], }, ]; } /** @param {{ list: readonly CohortWithRealizedPrice[], all: CohortAll, title: (name: string) => string }} args */ export function createGroupedPricesSection({ list, all, title }) { return { name: "Prices", tree: groupedRealizedPriceItems(list, all, title), }; } /** @param {{ list: readonly (CohortAll | CohortFull | CohortLongTerm)[], all: CohortAll, title: (name: string) => string }} args */ export function createGroupedPricesSectionFull({ list, all, title }) { return { name: "Prices", tree: [ ...groupedRealizedPriceItems(list, all, title), { name: "Capitalized", tree: [ { name: "Price", title: title("Capitalized Price"), top: mapCohortsWithAll(list, all, ({ name, color, tree }) => price({ series: tree.realized.capitalized.price, name, color }), ), }, { name: "Ratio", title: title("Capitalized Price Ratio"), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => baseline({ series: tree.realized.capitalized.price.ratio, name, color, unit: Unit.ratio, base: 1 }), ), }, ], }, ], }; }