[{"data":1,"prerenderedAt":352},["ShallowReactive",2],{"navigation_docs":3,"-guide-introduction":101,"-guide-introduction-surround":349},[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":11,"body":103,"description":342,"extension":343,"links":344,"meta":345,"navigation":346,"path":12,"seo":347,"stem":13,"__hash__":348},"docs\u002F1.guide\u002F1.introduction.md",{"type":104,"value":105,"toc":336},"minimark",[106,124,129,136,139,157,168,175,182,186,255,264,272,283,297,301,308,322,325,329,332],[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},"what-zocam-is","What zocam is",[107,130,131,132],{},"Zocam is a time library for Elixir. It does not schedule, store, or format anything. It answers one kind of question well: ",[133,134,135],"em",{},"which instants does this calendar expression denote?",[107,137,138],{},"Three concrete forms of that question, each one call away:",[140,141,142,151,154],"ul",{},[143,144,145,146,150],"li",{},"\"Is this instant a second Friday between 09:00 and 12:00?\" — one membership check with ",[147,148,149],"code",{},"member?\u002F2",", no horizon.",[143,152,153],{},"\"Which UTC windows do the Wednesdays of May 2026 cover?\" — one grounding call, DST handled.",[143,155,156],{},"\"When is the last working day of each month?\" — one ordinal selection.",[107,158,159,160,162,163,167],{},"The guide walks the second question step by step in ",[117,161,19],{"href":20},". The ",[117,164,165],{"href":94},[147,166,93],{}," reference opens with recipes for the second-Friday and last-working-day questions. Every example there runs as a doctest, so the test suite proves it stays true.",[107,169,170,171,174],{},"The word ",[133,172,173],{},"algebra"," describes the style. The library is built from small, composable values and pure functions over them. You combine them like expressions, not like configuration.",[107,176,177,178,181],{},"The name is a calendar word from the land the author is from: ",[133,179,180],{},"zocam"," is the Muisca common year, a cycle of twenty moons. Colonial priest José Domingo Duquesne recorded it in Bogotá; Humboldt studied it later. The word never stood alone — the Muisca said \"zocam ata\", year one — which suits a library whose values are always composed.",[125,183,185],{"id":184},"the-two-layers","The two layers",[187,188,193],"pre",{"className":189,"code":190,"language":191,"meta":192,"style":192},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TB\n  subgraph C[\"Calendar layer\"]\n    P[\"Zocam.Point\u003Cbr\u002F>one calendar thing\"]\n    S[\"Zocam.Span\u003Cbr\u002F>sets of instants over points\"]\n    P --> S\n  end\n  subgraph L[\"Timeline layer\"]\n    I[\"Zocam.Intervals\u003Cbr\u002F>concrete intervals, set operations\"]\n  end\n  S -- \"ground\u002F3 (timezone)\" --> I\n","mermaid","",[147,194,195,202,208,214,220,226,232,238,244,249],{"__ignoreMap":192},[110,196,199],{"class":197,"line":198},"line",1,[110,200,201],{},"flowchart TB\n",[110,203,205],{"class":197,"line":204},2,[110,206,207],{},"  subgraph C[\"Calendar layer\"]\n",[110,209,211],{"class":197,"line":210},3,[110,212,213],{},"    P[\"Zocam.Point\u003Cbr\u002F>one calendar thing\"]\n",[110,215,217],{"class":197,"line":216},4,[110,218,219],{},"    S[\"Zocam.Span\u003Cbr\u002F>sets of instants over points\"]\n",[110,221,223],{"class":197,"line":222},5,[110,224,225],{},"    P --> S\n",[110,227,229],{"class":197,"line":228},6,[110,230,231],{},"  end\n",[110,233,235],{"class":197,"line":234},7,[110,236,237],{},"  subgraph L[\"Timeline layer\"]\n",[110,239,241],{"class":197,"line":240},8,[110,242,243],{},"    I[\"Zocam.Intervals\u003Cbr\u002F>concrete intervals, set operations\"]\n",[110,245,247],{"class":197,"line":246},9,[110,248,231],{},[110,250,252],{"class":197,"line":251},10,[110,253,254],{},"  S -- \"ground\u002F3 (timezone)\" --> I\n",[107,256,257],{},[133,258,259,260,263],{},"Figure 1 — The calendar layer builds symbolic sets; the timeline layer holds concrete intervals; ",[147,261,262],{},"ground\u002F3"," is the only crossing. AI generated, human reviewed.",[107,265,266,271],{},[267,268,269],"strong",{},[147,270,77],{}," is the linear kernel: an algebra of intervals on the real timeline, with union, intersection, complement, and difference. Every higher layer reduces its questions to interval operations, so one small algebra serves the whole system.",[107,273,274,278,279,282],{},[267,275,276],{},[147,277,85],{}," models one calendar thing as a scope plus a refinement chain. \"May 2026\" is concrete; \"May\" is abstract — it names every May. The chain refines step by step: year, month, day, hour (",[117,280,281],{"href":40},"ADR-001",").",[107,284,285,289,290,293,294,282],{},[267,286,287],{},[147,288,93],{}," models ",[133,291,292],{},"sets"," of instants built from points: arcs with steps, unions, intersections, complements, and ordinal picks such as \"the last working day of the month\" (",[117,295,296],{"href":44},"ADR-002",[125,298,300],{"id":299},"one-denotation-function","One denotation function",[107,302,303,304,307],{},"The calendar layer answers two questions with one shared denotation function, so they can never disagree (",[117,305,306],{"href":56},"ADR-005","):",[140,309,310,316],{},[143,311,312,315],{},[147,313,314],{},"Span.member?(span, datetime)"," — is this instant in the set?",[143,317,318,321],{},[147,319,320],{},"Span.ground(span, horizon, timezone)"," — which concrete intervals does the set cover inside this horizon?",[107,323,324],{},"Timezones make this subtle. On a DST fall-back day, one wall-clock window grounds to two intervals. A wall time inside a spring-forward gap grounds to none. The shared denotation pins both behaviors in one place.",[125,326,328],{"id":327},"status","Status",[107,330,331],{},"Zocam is implemented: every public function has a body, and the test suite is fully green with no backlog. The API can still change — the library is young, and it keeps the freedom to break for a better design. The code grows test-first (TDD): the tests state the semantics, and the code follows them. The documentation follows the same rule: the examples in the API reference are doctests, so the suite runs them all.",[333,334,335],"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":192,"searchDepth":204,"depth":204,"links":337},[338,339,340,341],{"id":127,"depth":204,"text":128},{"id":184,"depth":204,"text":185},{"id":299,"depth":204,"text":300},{"id":327,"depth":204,"text":328},"What zocam is, how its two layers fit together, and where the library stands today.","md",null,{},true,{"title":11,"description":342},"ihjViXlzGPqKK6A7CV9Tl-IgCY3BS0qf2LmYYIYrIfs",[344,350],{"title":15,"path":16,"stem":17,"description":351,"children":-1},"Add zocam to a Mix project, run its tests, and build its documentation.",1786065168174]