Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/type.ml
Original file line number Diff line number Diff line change
Expand Up @@ -628,13 +628,23 @@ let rec lub t1 t2 =
| Prim Nat, Prim Int
| Prim Int, Prim Nat -> Prim Int
| Opt t1', Opt t2' -> Opt (lub t1' t2')
| Variant t1', Variant t2' -> Variant (lub_summands t1' t2')
| Prim Null, Opt t'
| Opt t', Prim Null -> Opt t'
| Array t1', (Obj _ as t2) -> lub (array_obj t1') t2
| (Obj _ as t1), Array t2' -> lub t1 (array_obj t2')
| t1', t2' when eq t1' t2' -> t1
| _ -> Any

and lub_summands fs1 fs2 = match fs1, fs2 with
| fs1, [] -> fs1
| [], fs2 -> fs2
| f1::fs1', f2::fs2' ->
begin match compare_summand f1 f2 with
| 0 -> (fst f1, lub (snd f1) (snd f2))::lub_summands fs1' fs2'
| 1 -> f2::lub_summands fs1 fs2'
| _ -> f1::lub_summands fs1' fs2
end

let rec glb t1 t2 =
if t1 == t2 then t1 else
Expand All @@ -649,11 +659,21 @@ let rec glb t1 t2 =
| Prim Nat, Prim Int
| Prim Int, Prim Nat -> Prim Nat
| Opt t1', Opt t2' -> Opt (glb t1' t2')
| Variant t1', Variant t2' -> Variant (glb_summands t1' t2')
| Prim Null, Opt _
| Opt _, Prim Null -> Prim Null
| t1', t2' when eq t1' t2' -> t1
| _ -> Non

and glb_summands fs1 fs2 = match fs1, fs2 with
| fs1, [] -> []
| [], fs2 -> []
| f1::fs1', f2::fs2' ->
begin match compare_summand f1 f2 with
| 0 -> (fst f1, glb (snd f1) (snd f2))::glb_summands fs1' fs2'
| 1 -> glb_summands fs1 fs2'
| _ -> glb_summands fs1' fs2
end

(* Pretty printing *)

Expand Down
1 change: 0 additions & 1 deletion test/repl/ok/variant-shorthand.stderr.ok

This file was deleted.

2 changes: 1 addition & 1 deletion test/repl/ok/variant-shorthand.stdout.ok
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ActorScript 0.1 interpreter
> #bar : {#bar}
> #foo (#bar) : {#foo : {#bar}}
> [#Monday, #Tuesday, #Wednesday, #Thursday, #Friday, #Saturday, #Sunday] : [Any]
> [#Monday, #Tuesday, #Wednesday, #Thursday, #Friday, #Saturday, #Sunday] : [{#Friday; #Monday; #Saturday; #Sunday; #Thursday; #Tuesday; #Wednesday}]
>
3 changes: 2 additions & 1 deletion test/run/variants.as
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,5 @@ assert (sayIcelandic (#Wednesday) == "Miðvikudagur");

assert (debug_show (#foo (#bar)) == "(#foo (#bar))");

assert (([#Monday, #Tuesday, #Wednesday, #Thursday, #Friday, #Saturday, #Sunday] : [Weekday]).len() == 7);
assert ([#Monday, #Tuesday, #Wednesday, #Thursday, #Friday, #Saturday, #Sunday].len() == 7);