@@ -0,0 +1,44 @@
1+module Record.Studio.SameKeys (class SameKeys, class SameKeysRL) where
2+
3+
4+import Data.Symbol (class IsSymbol)
5+import Prim.Row (class Lacks)
6+import Prim.RowList (class RowToList)
7+import Prim.RowList as RL
8+import Prim.TypeError (class Fail, Beside, Quote, Text)
9+import Type.RowList (class ListToRow)
10+
11+class SameKeys (r1 :: Row Type) (r2 :: Row Type)
12+
13+instance (RowToList r1 rl1, RowToList r2 rl2, SameKeysRL rl1 rl2) => SameKeys r1 r2
14+
15+class SameKeysRL (xs :: RL.RowList Type) (ys :: RL.RowList Type)
16+
17+instance SameKeysRL RL.Nil RL.Nil
18+instance
19+ ( IsSymbol name
20+ , SameKeysRL tail1 tail2
21+ ) =>
22+ SameKeysRL (RL.Cons name ty1 tail1) (RL.Cons name ty2 tail2)
23+else instance
24+ ( ListToRow RL.Nil r
25+ , Fail (Beside (Text "The key ") (Beside (Quote name) (Text " is missing from the second record")))
26+ ) =>
27+ SameKeysRL (RL.Cons name ty tail) RL.Nil
28+else instance
29+ ( ListToRow RL.Nil r
30+ , Fail (Beside (Text "The key ") (Beside (Quote name) (Text " is missing from the first record")))
31+ ) =>
32+ SameKeysRL RL.Nil (RL.Cons name ty tail)
33+else instance
34+ ( ListToRow (RL.Cons name2 ty1 tail1) r
35+ , Lacks name1 r
36+ , Fail (Beside (Text "The key ") (Beside (Quote name1) (Text " is missing from the second record")))
37+ ) =>
38+ SameKeysRL (RL.Cons name1 ty1 tail1) (RL.Cons name2 ty2 tail2)
39+else instance
40+ ( ListToRow (RL.Cons name1 ty1 tail1) r
41+ , Lacks name2 r
42+ , Fail (Beside (Text "The key ") (Beside (Quote name2) (Text " is missing from the first record")))
43+ ) =>
44+ SameKeysRL (RL.Cons name1 ty1 tail1) (RL.Cons name2 ty2 tail2)