Skip to content

Commit 0223834

Browse files
committed
update: add the arbitrary instances
1 parent 6b0de9a commit 0223834

File tree

2 files changed

+165
-70
lines changed

2 files changed

+165
-70
lines changed

lambda-buffers-compiler/lambda-buffers-compiler.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ library
100100
, parsec >=3.1
101101
, prettyprinter >=1.7
102102
, proto-lens >=0.7
103+
, QuickCheck >=2.14
103104
, text >=1.2
104105

105106
exposed-modules:

lambda-buffers-compiler/src/LambdaBuffers/Compiler/ProtoCompat/Types.hs

Lines changed: 164 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE DuplicateRecordFields #-}
2+
{-# OPTIONS_GHC -Wno-orphans #-}
23

34
module LambdaBuffers.Compiler.ProtoCompat.Types (
45
ClassDef (..),
@@ -44,11 +45,12 @@ module LambdaBuffers.Compiler.ProtoCompat.Types (
4445
) where
4546

4647
import Control.Exception (Exception)
47-
import Data.List.NonEmpty (NonEmpty)
48+
import Data.List.NonEmpty (NonEmpty ((:|)), (<|))
4849
import Data.Map qualified as M
49-
import Data.Text (Text)
50+
import Data.Text (Text, pack)
5051
import GHC.Generics (Generic)
5152
import LambdaBuffers.Compiler.KindCheck.Variable as VARS (Atom, Var)
53+
import Test.QuickCheck (Arbitrary (arbitrary), Gen, oneof, sized)
5254

5355
data SourceInfo = SourceInfo {file :: Text, posFrom :: SourcePosition, posTo :: SourcePosition}
5456
deriving stock (Show, Eq, Ord, Generic)
@@ -84,106 +86,58 @@ data ClassName = ClassName {name :: Text, sourceInfo :: SourceInfo}
8486
newtype Kind = Kind {kind :: KindType}
8587
deriving stock (Show, Eq, Ord, Generic)
8688

87-
data KindType
88-
= KindRef KindRefType
89-
| KindArrow Kind Kind
89+
data KindType = KindRef KindRefType | KindArrow Kind Kind
9090
deriving stock (Show, Eq, Ord, Generic)
9191

92-
data KindRefType
93-
= KUnspecified
94-
| KType
92+
data KindRefType = KUnspecified | KType
9593
deriving stock (Show, Eq, Ord, Generic)
9694

9795
data TyVar = TyVar {varName :: VarName, sourceInfo :: SourceInfo}
9896
deriving stock (Show, Eq, Ord, Generic)
9997

100-
data Ty
101-
= TyVarI TyVar
102-
| TyAppI TyApp
103-
| TyRefI TyRef
98+
data Ty = TyVarI TyVar | TyAppI TyApp | TyRefI TyRef
10499
deriving stock (Show, Eq, Ord, Generic)
105100

106-
data TyApp = TyApp
107-
{ tyFunc :: Ty
108-
, tyArgs :: NonEmpty Ty
109-
, sourceInfo :: SourceInfo
110-
}
101+
data TyApp = TyApp {tyFunc :: Ty, tyArgs :: NonEmpty Ty, sourceInfo :: SourceInfo}
111102
deriving stock (Show, Eq, Ord, Generic)
112103

113-
data ForeignRef = ForeignRef
114-
{ tyName :: TyName
115-
, moduleName :: ModuleName
116-
, sourceInfo :: SourceInfo
117-
}
104+
data ForeignRef = ForeignRef {tyName :: TyName, moduleName :: ModuleName, sourceInfo :: SourceInfo}
118105
deriving stock (Show, Eq, Ord, Generic)
119106

120107
data LocalRef = LocalRef {tyName :: TyName, sourceInfo :: SourceInfo}
121108
deriving stock (Show, Eq, Ord, Generic)
122109

123-
data TyRef
124-
= LocalI LocalRef
125-
| ForeignI ForeignRef
110+
data TyRef = LocalI LocalRef | ForeignI ForeignRef
126111
deriving stock (Show, Eq, Ord, Generic)
127112

128-
data TyDef = TyDef
129-
{ tyName :: TyName
130-
, tyAbs :: TyAbs
131-
, sourceInfo :: SourceInfo
132-
}
113+
data TyDef = TyDef {tyName :: TyName, tyAbs :: TyAbs, sourceInfo :: SourceInfo}
133114
deriving stock (Show, Eq, Ord, Generic)
134115

135-
data TyAbs = TyAbs
136-
{ tyArgs :: [TyArg]
137-
, tyBody :: TyBody
138-
, sourceInfo :: SourceInfo
139-
}
116+
data TyAbs = TyAbs {tyArgs :: [TyArg], tyBody :: TyBody, sourceInfo :: SourceInfo}
140117
deriving stock (Show, Eq, Ord, Generic)
141118

142-
data TyArg = TyArg
143-
{ argName :: VarName
144-
, argKind :: Kind
145-
, sourceInfo :: SourceInfo
146-
}
119+
data TyArg = TyArg {argName :: VarName, argKind :: Kind, sourceInfo :: SourceInfo}
147120
deriving stock (Show, Eq, Ord, Generic)
148121

149-
data TyBody
150-
= OpaqueI SourceInfo
151-
| SumI Sum
122+
data TyBody = OpaqueI SourceInfo | SumI Sum
152123
deriving stock (Show, Eq, Ord, Generic)
153124

154-
data Constructor = Constructor
155-
{ constrName :: ConstrName
156-
, product :: Product
157-
}
125+
data Constructor = Constructor {constrName :: ConstrName, product :: Product}
158126
deriving stock (Show, Eq, Ord, Generic)
159127

160-
data Sum = Sum
161-
{ constructors :: NonEmpty Constructor
162-
, sourceInfo :: SourceInfo
163-
}
128+
data Sum = Sum {constructors :: NonEmpty Constructor, sourceInfo :: SourceInfo}
164129
deriving stock (Show, Eq, Ord, Generic)
165130

166-
data Field = Field
167-
{ fieldName :: FieldName
168-
, fieldTy :: Ty
169-
}
131+
data Field = Field {fieldName :: FieldName, fieldTy :: Ty}
170132
deriving stock (Show, Eq, Ord, Generic)
171133

172-
data Record = Record
173-
{ fields :: NonEmpty Field
174-
, sourceInfo :: SourceInfo
175-
}
134+
data Record = Record {fields :: NonEmpty Field, sourceInfo :: SourceInfo}
176135
deriving stock (Show, Eq, Ord, Generic)
177136

178-
data Tuple = Tuple
179-
{ fields :: [Ty]
180-
, sourceInfo :: SourceInfo
181-
}
137+
data Tuple = Tuple {fields :: [Ty], sourceInfo :: SourceInfo}
182138
deriving stock (Show, Eq, Ord, Generic)
183139

184-
data Product
185-
= RecordI Record
186-
| TupleI Tuple
140+
data Product = RecordI Record | TupleI Tuple
187141
deriving stock (Show, Eq, Ord, Generic)
188142

189143
data ClassDef = ClassDef
@@ -237,17 +191,157 @@ instance Exception KindCheckErr
237191

238192
newtype CompilerInput = CompilerInput {modules :: [Module]}
239193
deriving stock (Show, Eq, Ord, Generic)
240-
deriving newtype (Monoid, Semigroup)
194+
deriving newtype (Monoid, Semigroup, Arbitrary)
241195

242-
newtype CompilerOutput = CompilerOutput
243-
{ typeDefs :: M.Map Var Kind
244-
}
196+
newtype CompilerOutput = CompilerOutput {typeDefs :: M.Map Var Kind}
245197
deriving stock (Show, Eq, Ord, Generic)
198+
deriving newtype (Arbitrary)
246199

247200
newtype CompilerFailure = KCErr KindCheckErr
248201
deriving stock (Show, Eq, Ord, Generic)
202+
deriving newtype (Arbitrary)
249203

250204
data CompilerResult
251205
= RCompilerFailure CompilerFailure
252206
| RCompilerOutput CompilerOutput
253207
deriving stock (Show, Eq, Ord, Generic)
208+
209+
instance Arbitrary SourceInfo where
210+
arbitrary = SourceInfo <$> arbitrary <*> arbitrary <*> arbitrary
211+
212+
instance Arbitrary SourcePosition where
213+
arbitrary = SourcePosition <$> arbitrary <*> arbitrary
214+
215+
instance Arbitrary LBName where
216+
arbitrary = LBName <$> arbitrary <*> arbitrary
217+
218+
instance Arbitrary TyName where
219+
arbitrary = TyName <$> arbitrary <*> arbitrary
220+
221+
instance Arbitrary ConstrName where
222+
arbitrary = ConstrName <$> arbitrary <*> arbitrary
223+
224+
instance Arbitrary ModuleName where
225+
arbitrary = ModuleName <$> arbitrary <*> arbitrary
226+
227+
instance Arbitrary ModuleNamePart where
228+
arbitrary = ModuleNamePart <$> arbitrary <*> arbitrary
229+
230+
instance Arbitrary VarName where
231+
arbitrary = VarName <$> arbitrary <*> arbitrary
232+
233+
instance Arbitrary FieldName where
234+
arbitrary = FieldName <$> arbitrary <*> arbitrary
235+
236+
instance Arbitrary ClassName where
237+
arbitrary = ClassName <$> arbitrary <*> arbitrary
238+
239+
instance Arbitrary Kind where
240+
arbitrary = Kind <$> arbitrary
241+
242+
instance Arbitrary KindType where
243+
arbitrary = oneof [KindRef <$> arbitrary, KindArrow <$> arbitrary <*> arbitrary]
244+
245+
instance Arbitrary KindRefType where
246+
arbitrary = oneof [pure KUnspecified, pure KType]
247+
248+
instance Arbitrary TyVar where
249+
arbitrary = TyVar <$> arbitrary <*> arbitrary
250+
251+
instance Arbitrary Ty where
252+
arbitrary = oneof [TyVarI <$> arbitrary, TyAppI <$> arbitrary, TyRefI <$> arbitrary]
253+
254+
instance Arbitrary TyApp where
255+
arbitrary = TyApp <$> arbitrary <*> arbitrary <*> arbitrary
256+
257+
instance Arbitrary ForeignRef where
258+
arbitrary = ForeignRef <$> arbitrary <*> arbitrary <*> arbitrary
259+
260+
instance Arbitrary LocalRef where
261+
arbitrary = LocalRef <$> arbitrary <*> arbitrary
262+
263+
instance Arbitrary TyRef where
264+
arbitrary = oneof [LocalI <$> arbitrary, ForeignI <$> arbitrary]
265+
266+
instance Arbitrary TyDef where
267+
arbitrary = TyDef <$> arbitrary <*> arbitrary <*> arbitrary
268+
269+
instance Arbitrary TyAbs where
270+
arbitrary = TyAbs <$> arbitrary <*> arbitrary <*> arbitrary
271+
272+
instance Arbitrary TyArg where
273+
arbitrary = TyArg <$> arbitrary <*> arbitrary <*> arbitrary
274+
275+
instance Arbitrary TyBody where
276+
arbitrary = oneof [OpaqueI <$> arbitrary, SumI <$> arbitrary]
277+
278+
instance Arbitrary Constructor where
279+
arbitrary = Constructor <$> arbitrary <*> arbitrary
280+
281+
instance Arbitrary Sum where
282+
arbitrary = Sum <$> arbitrary <*> arbitrary
283+
284+
instance Arbitrary Field where
285+
arbitrary = Field <$> arbitrary <*> arbitrary
286+
287+
instance Arbitrary Record where
288+
arbitrary = Record <$> arbitrary <*> arbitrary
289+
290+
instance Arbitrary Tuple where
291+
arbitrary = Tuple <$> arbitrary <*> arbitrary
292+
293+
instance Arbitrary Product where
294+
arbitrary = oneof [RecordI <$> arbitrary, TupleI <$> arbitrary]
295+
296+
instance Arbitrary ClassDef where
297+
arbitrary = ClassDef <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
298+
299+
instance Arbitrary InstanceClause where
300+
arbitrary = InstanceClause <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
301+
302+
instance Arbitrary Constraint where
303+
arbitrary = Constraint <$> arbitrary <*> arbitrary <*> arbitrary
304+
305+
instance Arbitrary Module where
306+
arbitrary = Module <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
307+
308+
instance Arbitrary InferenceErr where
309+
arbitrary =
310+
oneof
311+
[ UnboundTermErr <$> arbitrary
312+
, ImpossibleErr <$> arbitrary
313+
, UnificationErr <$> arbitrary
314+
, RecursiveSubstitutionErr <$> arbitrary
315+
]
316+
317+
instance Arbitrary KindCheckErr where
318+
arbitrary =
319+
oneof
320+
[ InconsistentTypeErr <$> arbitrary
321+
, InferenceFailure <$> arbitrary <*> arbitrary
322+
]
323+
324+
instance Arbitrary CompilerResult where
325+
arbitrary =
326+
oneof
327+
[ RCompilerFailure <$> arbitrary
328+
, RCompilerOutput <$> arbitrary
329+
]
330+
331+
-- Orphan Instances
332+
333+
instance Arbitrary a => Arbitrary (NonEmpty a) where
334+
arbitrary = sized f
335+
where
336+
f :: (Num t, Ord t) => t -> Gen (NonEmpty a)
337+
f n
338+
| n <= 0 = do
339+
x <- arbitrary @a
340+
pure $ x :| []
341+
| otherwise = do
342+
x <- arbitrary
343+
xs <- f (n - 1)
344+
pure $ x <| xs
345+
346+
instance Arbitrary Text where
347+
arbitrary = pack <$> arbitrary

0 commit comments

Comments
 (0)