1
1
module Validate where
2
2
3
+ import Data.List (nubBy , (\\) )
4
+ import Data.Function (on )
5
+
3
6
import TypeError
4
7
import Obj
5
8
import Types
@@ -19,13 +22,24 @@ validateMemberCases typeEnv typeVariables rest = mapM_ visit rest
19
22
20
23
validateMembers :: TypeEnv -> [Ty ] -> [XObj ] -> Either TypeError ()
21
24
validateMembers typeEnv typeVariables membersXObjs =
22
- if length membersXObjs `mod` 2 == 0
23
- then mapM_ (okXObjForType typeEnv typeVariables . snd ) (pairwise membersXObjs)
24
- else Left (UnevenMembers membersXObjs)
25
+ checkUnevenMembers >> checkDuplicateMembers >> checkMembers
26
+ where checkUnevenMembers =
27
+ if length membersXObjs `mod` 2 == 0
28
+ then Right ()
29
+ else Left (UnevenMembers membersXObjs)
30
+ pairs = pairwise membersXObjs
31
+ fields = fst <$> pairs
32
+ uniqueFields = nubBy ((==) `on` obj) fields
33
+ dups = fields \\ uniqueFields
34
+ checkDuplicateMembers =
35
+ if length fields == length uniqueFields
36
+ then Right ()
37
+ else Left (DuplicatedMembers dups)
38
+ checkMembers = mapM_ (okXObjForType typeEnv typeVariables . snd ) pairs
25
39
26
- validateOneCase :: XObj -> a
27
- validateOneCase XObj {} =
28
- error " Type members must be defined using array syntax: [member1 type1 member2 type2 ...]" -- | TODO: How to reach this case?
40
+ -- validateOneCase :: XObj -> a
41
+ -- validateOneCase XObj {} =
42
+ -- error "Type members must be defined using array syntax: [member1 type1 member2 type2 ...]" -- | TODO: How to reach this case?
29
43
30
44
okXObjForType :: TypeEnv -> [Ty ] -> XObj -> Either TypeError ()
31
45
okXObjForType typeEnv typeVariables xobj =
0 commit comments