git.iko.soy/rowtype-yoga/purescript-yoga-om-layer
on main help sign in
commit1be7a1195f851a93f813e2ab1ffce9c78fa0e48f authorMark <mark.eibes@gmail.com> dateSat 14 Feb 2026, 18:42 (8 months ago) parent1cd7810
2 files changed+39−38
.spec-results+33−33 src/Yoga/Om/Layer.purs+6−5
.spec-results+33−33
@@ -2,231 +2,231 @@
22 [
33 "Automatic Memoization builds the same layer only once when used in two branches",
44 {
5− "timestamp": "1771057579324.0",
5+ "timestamp": "1771090955841.0",
66 "success": true
77 }
88 ],
99 [
1010 "Automatic Memoization memoized bracketLayer acquires and releases only once",
1111 {
12− "timestamp": "1771057579324.0",
12+ "timestamp": "1771090955841.0",
1313 "success": true
1414 }
1515 ],
1616 [
1717 "Automatic Memoization memoized scoped layer runs finalizer only once",
1818 {
19− "timestamp": "1771057579324.0",
19+ "timestamp": "1771090955841.0",
2020 "success": true
2121 }
2222 ],
2323 [
2424 "Composition proves Row.Nub deduplicates shared requirements at type level",
2525 {
26− "timestamp": "1771057579324.0",
26+ "timestamp": "1771090955841.0",
2727 "success": true
2828 }
2929 ],
3030 [
3131 "Composition proves deduplication at runtime via shared Ref",
3232 {
33− "timestamp": "1771057579324.0",
33+ "timestamp": "1771090955841.0",
3434 "success": true
3535 }
3636 ],
3737 [
3838 "Error Channel composes layers with different error types",
3939 {
40− "timestamp": "1771057579324.0",
40+ "timestamp": "1771090955841.0",
4141 "success": true
4242 }
4343 ],
4444 [
4545 "Error Channel propagates errors from the first layer",
4646 {
47− "timestamp": "1771057579324.0",
47+ "timestamp": "1771090955841.0",
4848 "success": true
4949 }
5050 ],
5151 [
5252 "Error Channel propagates errors from the second layer",
5353 {
54− "timestamp": "1771057579324.0",
54+ "timestamp": "1771090955841.0",
5555 "success": true
5656 }
5757 ],
5858 [
5959 "Error Channel propagates errors through vertical composition",
6060 {
61− "timestamp": "1771057579324.0",
61+ "timestamp": "1771090955841.0",
6262 "success": true
6363 }
6464 ],
6565 [
6666 "Error Channel scoped layer error triggers finalizers",
6767 {
68− "timestamp": "1771057579324.0",
68+ "timestamp": "1771090955841.0",
6969 "success": true
7070 }
7171 ],
7272 [
7373 "Error Channel scoped layers with errors run via runScopedWith",
7474 {
75− "timestamp": "1771057579324.0",
75+ "timestamp": "1771090955841.0",
7676 "success": true
7777 }
7878 ],
7979 [
8080 "Functor / Apply / Bind applies two layers",
8181 {
82− "timestamp": "1771057579324.0",
82+ "timestamp": "1771090955841.0",
8383 "success": true
8484 }
8585 ],
8686 [
8787 "Functor / Apply / Bind binds layers sequentially",
8888 {
89− "timestamp": "1771057579324.0",
89+ "timestamp": "1771090955841.0",
9090 "success": true
9191 }
9292 ],
9393 [
9494 "Functor / Apply / Bind maps over layer output",
9595 {
96− "timestamp": "1771057579324.0",
96+ "timestamp": "1771090955841.0",
9797 "success": true
9898 }
9999 ],
100100 [
101101 "Layer recovering does not retry on non-matching errors",
102102 {
103− "timestamp": "1771057579324.0",
103+ "timestamp": "1771090955841.0",
104104 "success": true
105105 }
106106 ],
107107 [
108108 "Layer recovering only retries the specified error in a multi-error layer",
109109 {
110− "timestamp": "1771057579324.0",
110+ "timestamp": "1771090955841.0",
111111 "success": true
112112 }
113113 ],
114114 [
115115 "Layer recovering preserves the error when retries are exhausted",
116116 {
117− "timestamp": "1771057579324.0",
117+ "timestamp": "1771090955841.0",
118118 "success": true
119119 }
120120 ],
121121 [
122122 "Layer recovering retries layer construction on matching errors",
123123 {
124− "timestamp": "1771057579324.0",
124+ "timestamp": "1771090955841.0",
125125 "success": true
126126 }
127127 ],
128128 [
129129 "Layer recovering uses RetryStatus in the check",
130130 {
131− "timestamp": "1771057579324.0",
131+ "timestamp": "1771090955841.0",
132132 "success": true
133133 }
134134 ],
135135 [
136136 "Layer repeating repeats layer construction while condition holds",
137137 {
138− "timestamp": "1771057579324.0",
138+ "timestamp": "1771090955841.0",
139139 "success": true
140140 }
141141 ],
142142 [
143143 "Layer repeating stops when policy exhausted",
144144 {
145− "timestamp": "1771057579324.0",
145+ "timestamp": "1771090955841.0",
146146 "success": true
147147 }
148148 ],
149149 [
150150 "Parallel runs layers in parallel via parApply",
151151 {
152− "timestamp": "1771057579324.0",
152+ "timestamp": "1771090955841.0",
153153 "success": true
154154 }
155155 ],
156156 [
157157 "Scoped Layers combines scoped and non-scoped layers",
158158 {
159− "timestamp": "1771057579324.0",
159+ "timestamp": "1771090955841.0",
160160 "success": true
161161 }
162162 ],
163163 [
164164 "Scoped Layers fresh layer builds twice even when same base layer",
165165 {
166− "timestamp": "1771057579324.0",
166+ "timestamp": "1771090955841.0",
167167 "success": true
168168 }
169169 ],
170170 [
171171 "Scoped Layers runs finalizers in reverse order on success",
172172 {
173− "timestamp": "1771057579324.0",
173+ "timestamp": "1771090955841.0",
174174 "success": true
175175 }
176176 ],
177177 [
178178 "Scoped Layers runs finalizers when the callback throws",
179179 {
180− "timestamp": "1771057579324.0",
180+ "timestamp": "1771090955841.0",
181181 "success": true
182182 }
183183 ],
184184 [
185185 "Scoped Layers threads finalizers through vertical composition (provide)",
186186 {
187− "timestamp": "1771057579324.0",
187+ "timestamp": "1771090955841.0",
188188 "success": true
189189 }
190190 ],
191191 [
192192 "Scoped Layers works with bracketLayer",
193193 {
194− "timestamp": "1771057579324.0",
194+ "timestamp": "1771090955841.0",
195195 "success": true
196196 }
197197 ],
198198 [
199199 "wireLayers memoizes shared dependencies within wireLayers",
200200 {
201− "timestamp": "1771057579324.0",
201+ "timestamp": "1771090955841.0",
202202 "success": true
203203 }
204204 ],
205205 [
206206 "wireLayers wireLayersDebug emits dependency graph as compiler warning",
207207 {
208− "timestamp": "1771057579324.0",
208+ "timestamp": "1771090955841.0",
209209 "success": true
210210 }
211211 ],
212212 [
213213 "wireLayers wires a diamond dependency",
214214 {
215− "timestamp": "1771057579324.0",
215+ "timestamp": "1771090955841.0",
216216 "success": true
217217 }
218218 ],
219219 [
220220 "wireLayers wires a simple linear chain (A -> B -> C)",
221221 {
222− "timestamp": "1771057579324.0",
222+ "timestamp": "1771090955841.0",
223223 "success": true
224224 }
225225 ],
226226 [
227227 "wireLayers wires independent layers with no inter-dependencies",
228228 {
229− "timestamp": "1771057579324.0",
229+ "timestamp": "1771090955841.0",
230230 "success": true
231231 }
232232 ]
src/Yoga/Om/Layer.purs+6−5
@@ -700,7 +700,7 @@ class IsNil (rl :: RowList Type) (result :: Boolean) | rl -> result
700700instance IsNil Nil True
701701else instance IsNil (Cons sym ty tail) False
702702
703−-- | Format a node: root gets ○, others get ◀── providerList
703+-- | Format a node: each layer appears once, indented by depth, with providers listed.
704704class FormatNode (isRoot :: Boolean) (depth :: Symbol) (sym :: Symbol) (reqRL :: RowList Type) (allLayers :: RowList Type) (line :: Symbol) | isRoot depth sym reqRL allLayers -> line
705705
706706-- Root node
@@ -711,13 +711,14 @@ instance
711711 ) =>
712712 FormatNode True depth sym Nil allLayers line
713713
714−-- Non-root: show providers ───▶ this
714+-- Non-root: show this ◂── providerList
715715else instance
716716 ( ProviderNames reqRL allLayers provSym
717717 , Append " " depth s1
718− , Append s1 provSym s2
719− , Append s2 " ───▶ " s3
720− , Append s3 sym line
718+ , Append s1 "○ " s2
719+ , Append s2 sym s3
720+ , Append s3 " ◂── " s4
721+ , Append s4 provSym line
721722 ) =>
722723 FormatNode False depth sym reqRL allLayers line
723724