Skip to content

Commit aeee997

Browse files
committed
update: add the arbitrary instances
1 parent 76b88c8 commit aeee997

File tree

2 files changed

+167
-73
lines changed

2 files changed

+167
-73
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,10 @@ common common-language
8585

8686
common common-imports
8787
build-depends:
88-
, base >=4.16
89-
, lens >=5.2
90-
, QuickCheck >=2.14
88+
, base >=4.16
89+
, lens >=5.2
90+
, QuickCheck >=2.14
91+
, template-haskell >=2.14
9192

9293
library
9394
import: common-language

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

Lines changed: 163 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
{-# LANGUAGE DerivingVia #-}
12
{-# LANGUAGE DuplicateRecordFields #-}
3+
{-# OPTIONS_GHC -Wno-orphans #-}
24

35
module LambdaBuffers.Compiler.ProtoCompat.Types (
46
ClassDef (..),
@@ -44,11 +46,12 @@ module LambdaBuffers.Compiler.ProtoCompat.Types (
4446
) where
4547

4648
import Control.Exception (Exception)
47-
import Data.List.NonEmpty (NonEmpty)
49+
import Data.List.NonEmpty (NonEmpty ((:|)), (<|))
4850
import Data.Map qualified as M
49-
import Data.Text (Text)
51+
import Data.Text (Text, pack)
5052
import GHC.Generics (Generic)
5153
import LambdaBuffers.Compiler.KindCheck.Variable as VARS (Atom, Var)
54+
import Test.QuickCheck (Arbitrary (arbitrary), Gen, oneof, sized)
5255

5356
data SourceInfo = SourceInfo {file :: Text, posFrom :: SourcePosition, posTo :: SourcePosition}
5457
deriving stock (Show, Eq, Ord, Generic)
@@ -84,106 +87,58 @@ data ClassName = ClassName {name :: Text, sourceInfo :: SourceInfo}
8487
newtype Kind = Kind {kind :: KindType}
8588
deriving stock (Show, Eq, Ord, Generic)
8689

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

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

9796
data TyVar = TyVar {varName :: VarName, sourceInfo :: SourceInfo}
9897
deriving stock (Show, Eq, Ord, Generic)
9998

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

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

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

120108
data LocalRef = LocalRef {tyName :: TyName, sourceInfo :: SourceInfo}
121109
deriving stock (Show, Eq, Ord, Generic)
122110

123-
data TyRef
124-
= LocalI LocalRef
125-
| ForeignI ForeignRef
111+
data TyRef = LocalI LocalRef | ForeignI ForeignRef
126112
deriving stock (Show, Eq, Ord, Generic)
127113

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

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

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

149-
data TyBody
150-
= OpaqueI SourceInfo
151-
| SumI Sum
123+
data TyBody = OpaqueI SourceInfo | SumI Sum
152124
deriving stock (Show, Eq, Ord, Generic)
153125

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

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

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

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

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

184-
data Product
185-
= RecordI Record
186-
| TupleI Tuple
141+
data Product = RecordI Record | TupleI Tuple
187142
deriving stock (Show, Eq, Ord, Generic)
188143

189144
data ClassDef = ClassDef
@@ -237,17 +192,155 @@ instance Exception KindCheckErr
237192

238193
newtype CompilerInput = CompilerInput {modules :: [Module]}
239194
deriving stock (Show, Eq, Ord, Generic)
240-
deriving newtype (Monoid, Semigroup)
195+
deriving newtype (Monoid, Semigroup, Arbitrary)
241196

242-
newtype CompilerOutput = CompilerOutput
243-
{ typeDefs :: M.Map Var Kind
244-
}
197+
newtype CompilerOutput = CompilerOutput {typeDefs :: M.Map Var Kind}
245198
deriving stock (Show, Eq, Ord, Generic)
199+
deriving newtype (Arbitrary)
246200

247201
newtype CompilerFailure = KCErr KindCheckErr
248202
deriving stock (Show, Eq, Ord, Generic)
203+
deriving newtype (Arbitrary)
249204

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

0 commit comments

Comments
 (0)