[{"data":1,"prerenderedAt":398},["ShallowReactive",2],{"navigation_docs":3,"-guide-getting-started":101,"-guide-getting-started-surround":393},[4,23,66],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Guide","i-lucide-book-open","\u002Fguide","1.guide",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fguide\u002Fintroduction","1.guide\u002F1.introduction",{"title":15,"path":16,"stem":17},"Getting started","\u002Fguide\u002Fgetting-started","1.guide\u002F2.getting-started",{"title":19,"path":20,"stem":21},"Pieces and sets","\u002Fguide\u002Fpieces-and-sets","1.guide\u002F3.pieces-and-sets",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28},"Design (ADRs)","i-lucide-drafting-compass","\u002Fdesign","2.design",[29,32],{"title":30,"path":26,"stem":31},"Design decisions (ADRs)","2.design\u002Findex",{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":22},"Decision records","i-lucide-scroll-text","\u002Fdesign\u002Fadrs","2.design\u002Fadrs",[38,42,46,50,54,58,62],{"title":39,"path":40,"stem":41},"ADR-001: The refinement-chain model for calendar points","\u002Fdesign\u002Fadrs\u002F001-refinement-chain","2.design\u002Fadrs\u002F001-refinement-chain",{"title":43,"path":44,"stem":45},"ADR-002: Sets first — the Span algebra","\u002Fdesign\u002Fadrs\u002F002-set-primary-spans","2.design\u002Fadrs\u002F002-set-primary-spans",{"title":47,"path":48,"stem":49},"ADR-003: Overflow policy — clamp by default, skip on request","\u002Fdesign\u002Fadrs\u002F003-overflow-policy","2.design\u002Fadrs\u002F003-overflow-policy",{"title":51,"path":52,"stem":53},"ADR-004: Fortnights as every-k scopes","\u002Fdesign\u002Fadrs\u002F004-fortnight-scopes","2.design\u002Fadrs\u002F004-fortnight-scopes",{"title":55,"path":56,"stem":57},"ADR-005: One denotation function, and what DST does to it","\u002Fdesign\u002Fadrs\u002F005-shared-denotation","2.design\u002Fadrs\u002F005-shared-denotation",{"title":59,"path":60,"stem":61},"ADR-006: Zocam is a standalone, released library","\u002Fdesign\u002Fadrs\u002F006-standalone-library","2.design\u002Fadrs\u002F006-standalone-library",{"title":63,"path":64,"stem":65},"ADR-007: A set is one value — struct answers, enumerable shapes","\u002Fdesign\u002Fadrs\u002F007-one-value-sets","2.design\u002Fadrs\u002F007-one-value-sets",{"title":67,"path":68,"stem":69,"children":70,"icon":100},"API Reference","\u002Fapi","3.api\u002Findex",[71,72,76,80,84,88,92,96],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Zocam","\u002Fapi\u002Fzocam","3.api\u002Fzocam",{"title":77,"path":78,"stem":79},"Zocam.Intervals","\u002Fapi\u002Fzocam-intervals","3.api\u002Fzocam-intervals",{"title":81,"path":82,"stem":83},"Zocam.ISO","\u002Fapi\u002Fzocam-iso","3.api\u002Fzocam-iso",{"title":85,"path":86,"stem":87},"Zocam.Point","\u002Fapi\u002Fzocam-point","3.api\u002Fzocam-point",{"title":89,"path":90,"stem":91},"Zocam.Point.ComposeError","\u002Fapi\u002Fzocam-point-composeerror","3.api\u002Fzocam-point-composeerror",{"title":93,"path":94,"stem":95},"Zocam.Span","\u002Fapi\u002Fzocam-span","3.api\u002Fzocam-span",{"title":97,"path":98,"stem":99},"Zocam.Span.Arc","\u002Fapi\u002Fzocam-span-arc","3.api\u002Fzocam-span-arc","i-lucide-braces",{"id":102,"title":15,"body":103,"description":386,"extension":387,"links":388,"meta":389,"navigation":390,"path":16,"seo":391,"stem":17,"__hash__":392},"docs\u002F1.guide\u002F2.getting-started.md",{"type":104,"value":105,"toc":380},"minimark",[106,124,129,132,146,186,189,200,207,222,239,243,246,263,287,293,297,300,309,324,344,353,357,367,376],[107,108,109,115,116,123],"p",{},[110,111,114],"span",{"className":112},[113],"ai-slop","AI SLOP"," An AI agent wrote this page. ",[117,118,122],"a",{"href":119,"rel":120},"https:\u002F\u002Fgithub.com\u002Fyuri4n",[121],"nofollow","yuri4n",", a senior engineer, gave the direction and did the review. The review is human, thus errors can stay.",[125,126,128],"h2",{"id":127},"install","Install",[107,130,131],{},"You want to use zocam in a Mix project. Do these steps.",[107,133,134,135,140,141,145],{},"Zocam is published on ",[117,136,139],{"href":137,"rel":138},"https:\u002F\u002Fhex.pm\u002Fpackages\u002Fzocam",[121],"Hex",". Add it to the dependencies in your ",[142,143,144],"code",{},"mix.exs",":",[147,148,153],"pre",{"className":149,"code":150,"language":151,"meta":152,"style":152},"language-elixir shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","def deps do\n  [\n    {:zocam, \"~> 0.1\"}\n  ]\nend\n","elixir","",[142,154,155,162,168,174,180],{"__ignoreMap":152},[110,156,159],{"class":157,"line":158},"line",1,[110,160,161],{},"def deps do\n",[110,163,165],{"class":157,"line":164},2,[110,166,167],{},"  [\n",[110,169,171],{"class":157,"line":170},3,[110,172,173],{},"    {:zocam, \"~> 0.1\"}\n",[110,175,177],{"class":157,"line":176},4,[110,178,179],{},"  ]\n",[110,181,183],{"class":157,"line":182},5,[110,184,185],{},"end\n",[107,187,188],{},"Then fetch it:",[147,190,194],{"className":191,"code":192,"language":193,"meta":152,"style":152},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mix deps.get\n","sh",[142,195,196],{"__ignoreMap":152},[110,197,198],{"class":157,"line":158},[110,199,192],{},[107,201,202,203,206],{},"Then prove the install with a first question. Start ",[142,204,205],{},"iex -S mix"," and ask whether May 15 2026 is in May:",[147,208,210],{"className":149,"code":209,"language":151,"meta":152,"style":152},"iex> Zocam.Span.member?(Zocam.Span.of(Zocam.Point.month(:may)), ~U[2026-05-15 12:00:00Z])\ntrue\n",[142,211,212,217],{"__ignoreMap":152},[110,213,214],{"class":157,"line":158},[110,215,216],{},"iex> Zocam.Span.member?(Zocam.Span.of(Zocam.Point.month(:may)), ~U[2026-05-15 12:00:00Z])\n",[110,218,219],{"class":157,"line":164},[110,220,221],{},"true\n",[107,223,224,225,230,231,234,235,238],{},"The full module reference also lives on ",[117,226,229],{"href":227,"rel":228},"https:\u002F\u002Fhexdocs.pm\u002Fzocam",[121],"hexdocs.pm\u002Fzocam"," — the same content as the ",[117,232,233],{"href":68},"API reference"," here, rendered by ExDoc. Its examples are doctests, so you can paste any of them into the same ",[142,236,237],{},"iex"," session.",[125,240,242],{"id":241},"work-on-the-library-itself","Work on the library itself",[107,244,245],{},"You want to change zocam, or run its tests. Do these steps.",[107,247,248,249,252,253,258,259,262],{},"The library needs Elixir 1.20.2 on Erlang\u002FOTP 29. The repository pins these versions in ",[142,250,251],{},"mise.toml","; with ",[117,254,257],{"href":255,"rel":256},"https:\u002F\u002Fmise.jdx.dev",[121],"mise"," installed, run ",[142,260,261],{},"mise install"," in the repository root and you get the correct versions.",[147,264,266],{"className":191,"code":265,"language":193,"meta":152,"style":152},"git clone https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fzocam.git\ncd zocam\nmix deps.get\nmix test\n",[142,267,268,273,278,282],{"__ignoreMap":152},[110,269,270],{"class":157,"line":158},[110,271,272],{},"git clone https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fzocam.git\n",[110,274,275],{"class":157,"line":164},[110,276,277],{},"cd zocam\n",[110,279,280],{"class":157,"line":170},[110,281,192],{},[110,283,284],{"class":157,"line":176},[110,285,286],{},"mix test\n",[107,288,289,292],{},[142,290,291],{},"mix test"," must stay green at all times. The library has no stub backlog: every public function is implemented, and the tests state its semantics.",[125,294,296],{"id":295},"build-the-documentation","Build the documentation",[107,298,299],{},"You want to build the reference, or run this site on your machine. Do these steps.",[147,301,303],{"className":191,"code":302,"language":193,"meta":152,"style":152},"mix docs\n",[142,304,305],{"__ignoreMap":152},[110,306,307],{"class":157,"line":158},[110,308,302],{},[107,310,311,312,315,316,319,320,323],{},"ExDoc writes the reference to ",[142,313,314],{},"doc\u002F",". This website ingests that same output: ",[142,317,318],{},"docs\u002F"," is a Nuxt application, and ",[142,321,322],{},"docs\u002Fscripts\u002Fingest-exdoc.mjs"," transforms the ExDoc markdown and the ADR sources into the pages you read here.",[147,325,327],{"className":191,"code":326,"language":193,"meta":152,"style":152},"cd docs\npnpm install\npnpm dev\n",[142,328,329,334,339],{"__ignoreMap":152},[110,330,331],{"class":157,"line":158},[110,332,333],{},"cd docs\n",[110,335,336],{"class":157,"line":164},[110,337,338],{},"pnpm install\n",[110,340,341],{"class":157,"line":170},[110,342,343],{},"pnpm dev\n",[107,345,346,347,352],{},"The site needs Node.js 22 or newer, plus ",[117,348,351],{"href":349,"rel":350},"https:\u002F\u002Fpnpm.io",[121],"pnpm",".",[125,354,356],{"id":355},"release-for-the-maintainer","Release (for the maintainer)",[107,358,359,360,363,364,366],{},"A release is one tag push. GitHub Actions checks that the tag equals the ",[142,361,362],{},"version"," in ",[142,365,144],{},", runs the tests, and publishes the package to Hex.pm — which also publishes the docs to hexdocs.pm:",[147,368,370],{"className":191,"code":369,"language":193,"meta":152,"style":152},"git tag v0.1.0 && git push origin v0.1.0\n",[142,371,372],{"__ignoreMap":152},[110,373,374],{"class":157,"line":158},[110,375,369],{},[377,378,379],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":152,"searchDepth":164,"depth":164,"links":381},[382,383,384,385],{"id":127,"depth":164,"text":128},{"id":241,"depth":164,"text":242},{"id":295,"depth":164,"text":296},{"id":355,"depth":164,"text":356},"Add zocam to a Mix project, run its tests, and build its documentation.","md",null,{},true,{"title":15,"description":386},"MBm50M8-laxZ7Bi1K_g9pluJQqcZQAoPdRnOrwEFjg0",[394,396],{"title":11,"path":12,"stem":13,"description":395,"children":-1},"What zocam is, how its two layers fit together, and where the library stands today.",{"title":19,"path":20,"stem":21,"description":397,"children":-1},"The four data names of zocam — Span.Arc, Span, Intervals.interval, and Intervals — and how to keep them apart.",1786065169074]