Skip to content

Commit c33561b

Browse files
committed
Make slicing type formers authoritative
1 parent 7d587e8 commit c33561b

8 files changed

Lines changed: 849 additions & 570 deletions

File tree

src/language/statics/ConstructorStaticsHelpers.re

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -330,29 +330,33 @@ let ctr_uses =
330330
|> CoCtx.union;
331331

332332
// A constructor pattern's payload, as a component of the type it matches.
333-
let payload_former = (ctr: Constructor.t): MatchedTyp.former => {
334-
match_: (ctx, ty) =>
335-
Typ.get_sum_constructors(ctx, ty)
336-
|> Option.map(
337-
List.find_map(
338-
fun
339-
| ConstructorMap.Variant(name, _, payload)
340-
when Constructor.equal(name, ctr) =>
341-
Some([payload |> Option.value(~default=Typ.gap)])
342-
| _ => None,
343-
),
344-
)
345-
|> Option.join,
346-
build:
347-
fun
348-
| [payload] =>
349-
Sum([
350-
ConstructorMap.Variant(
351-
ctr,
352-
ConstructorMap.empty_variant_ann,
353-
Some(payload),
354-
),
355-
])
356-
|> Typ.temp
357-
| _ => Typ.gap,
358-
};
333+
let payload_former = (ctr: Constructor.t): MatchedTyp.former =>
334+
MatchedTyp.make_former(
335+
~arity=1,
336+
~parts=
337+
ty =>
338+
switch (Typ.term_of(ty)) {
339+
| Sum(variants) =>
340+
List.find_map(
341+
fun
342+
| ConstructorMap.Variant(name, _, payload)
343+
when Constructor.equal(name, ctr) =>
344+
Some([payload |> Option.value(~default=Typ.gap)])
345+
| _ => None,
346+
variants,
347+
)
348+
| _ => None
349+
},
350+
~whole=
351+
fun
352+
| [payload] =>
353+
Sum([
354+
ConstructorMap.Variant(
355+
ctr,
356+
ConstructorMap.empty_variant_ann,
357+
Some(payload),
358+
),
359+
])
360+
|> Typ.temp
361+
| _ => Typ.gap,
362+
);

0 commit comments

Comments
 (0)