6 | import Core.Normalise
9 | import Libraries.Data.WithDefault
15 | interface Reify a where
16 | reify : {auto c : Ref Ctxt Defs} ->
18 | Defs -> NF vars -> Core a
21 | interface Reflect a where
22 | reflect : {vars : _} ->
23 | FC -> Defs -> (onLHS : Bool) ->
24 | Env Term vars -> a -> Core (Term vars)
27 | getCon : {vars : _} ->
28 | FC -> Defs -> Name -> Core (Term vars)
30 | = case !(lookupDefExact n (gamma defs)) of
31 | Just (DCon t a _) => resolved (gamma defs) (Ref fc (DataCon t a) n)
32 | Just (TCon a _ _ _ _ _ _) => resolved (gamma defs) (Ref fc (TyCon a) n)
33 | Just _ => resolved (gamma defs) (Ref fc Func n)
34 | _ => throw (UndefinedName fc n)
37 | appCon : {vars : _} ->
38 | FC -> Defs -> Name -> List (Term vars) -> Core (Term vars)
39 | appCon fc defs n args
40 | = do fn <- getCon fc defs n
41 | resolved (gamma defs) (apply fc fn args)
44 | preludetypes : String -> Name
45 | preludetypes n = NS typesNS (UN $
Basic n)
48 | basics : String -> Name
49 | basics n = NS basicsNS (UN $
Basic n)
52 | builtin : String -> Name
53 | builtin n = NS builtinNS (UN $
Basic n)
56 | primio : String -> Name
57 | primio n = NS primIONS (UN $
Basic n)
60 | reflection : String -> Name
61 | reflection n = NS reflectionNS (UN $
Basic n)
64 | reflectiontt : String -> Name
65 | reflectiontt n = NS reflectionTTNS (UN $
Basic n)
68 | reflectionttimp : String -> Name
69 | reflectionttimp n = NS reflectionTTImpNS (UN $
Basic n)
72 | cantReify : Ref Ctxt Defs => {vars : _} -> NF vars -> String -> Core a
73 | cantReify val ty = do
74 | logNF "reflection.reify" 10 "Can't reify as \{ty}" (mkEnv emptyFC vars) val
75 | throw (GenericMsg (getLoc val) ("Can't reify as " ++ ty))
78 | cantReflect : FC -> String -> Core a
80 | = throw (GenericMsg fc ("Can't reflect as " ++ ty))
84 | reify defs _ = pure ()
88 | reflect fc defs lhs env _ = getCon fc defs (builtin "MkUnit")
92 | reify defs (NPrimVal _ (Str str)) = pure str
93 | reify defs val = cantReify val "String"
96 | Reflect String where
97 | reflect fc defs lhs env x = pure (PrimVal fc (Str x))
101 | reify defs (NPrimVal _ (I v)) = pure v
102 | reify defs val = cantReify val "Int"
106 | reflect fc defs lhs env x = pure (PrimVal fc (I x))
110 | reify defs (NPrimVal _ (I8 v)) = pure v
111 | reify defs val = cantReify val "Int8"
115 | reflect fc defs lhs env x = pure (PrimVal fc (I8 x))
119 | reify defs (NPrimVal _ (I16 v)) = pure v
120 | reify defs val = cantReify val "Int16"
123 | Reflect Int16 where
124 | reflect fc defs lhs env x = pure (PrimVal fc (I16 x))
128 | reify defs (NPrimVal _ (I32 v)) = pure v
129 | reify defs val = cantReify val "Int32"
132 | Reflect Int32 where
133 | reflect fc defs lhs env x = pure (PrimVal fc (I32 x))
137 | reify defs (NPrimVal _ (I64 v)) = pure v
138 | reify defs val = cantReify val "Int64"
141 | Reflect Int64 where
142 | reflect fc defs lhs env x = pure (PrimVal fc (I64 x))
146 | reify defs (NPrimVal _ (B8 v)) = pure v
147 | reify defs val = cantReify val "Bits8"
150 | Reflect Bits8 where
151 | reflect fc defs lhs env x = pure (PrimVal fc (B8 x))
155 | reify defs (NPrimVal _ (B16 v)) = pure v
156 | reify defs val = cantReify val "Bits16"
159 | Reflect Bits16 where
160 | reflect fc defs lhs env x = pure (PrimVal fc (B16 x))
164 | reify defs (NPrimVal _ (B32 v)) = pure v
165 | reify defs val = cantReify val "Bits32"
168 | Reflect Bits32 where
169 | reflect fc defs lhs env x = pure (PrimVal fc (B32 x))
173 | reify defs (NPrimVal _ (B64 v)) = pure v
174 | reify defs val = cantReify val "Bits64"
177 | Reflect Bits64 where
178 | reflect fc defs lhs env x = pure (PrimVal fc (B64 x))
181 | Reify Integer where
182 | reify defs (NPrimVal _ (BI v)) = pure v
183 | reify defs val = cantReify val "Integer"
186 | Reflect Integer where
187 | reflect fc defs lhs env x = pure (PrimVal fc (BI x))
191 | reify defs (NPrimVal _ (Ch v)) = pure v
192 | reify defs val = cantReify val "Char"
196 | reflect fc defs lhs env x = pure (PrimVal fc (Ch x))
200 | reify defs (NPrimVal _ (Db v)) = pure v
201 | reify defs val = cantReify val "Double"
204 | Reflect Double where
205 | reflect fc defs lhs env x = pure (PrimVal fc (Db x))
209 | reify defs val@(NDCon _ n _ _ _)
210 | = case dropAllNS !(full (gamma defs) n) of
211 | UN (Basic "True") => pure True
212 | UN (Basic "False") => pure False
213 | _ => cantReify val "Bool"
214 | reify defs val = cantReify val "Bool"
218 | reflect fc defs lhs env True = getCon fc defs (basics "True")
219 | reflect fc defs lhs env False = getCon fc defs (basics "False")
223 | reify defs val@(NDCon _ n _ _ args)
224 | = case (dropAllNS !(full (gamma defs) n), args) of
225 | (UN (Basic "Z"), _) => pure Z
226 | (UN (Basic "S"), [(_, k)])
227 | => do k' <- reify defs !(evalClosure defs k)
229 | _ => cantReify val "Nat"
230 | reify defs val = cantReify val "Nat"
234 | reflect fc defs lhs env Z = getCon fc defs (preludetypes "Z")
235 | reflect fc defs lhs env (S k)
236 | = do k' <- reflect fc defs lhs env k
237 | appCon fc defs (preludetypes "S") [k']
240 | Reify a => Reify (List a) where
241 | reify defs val@(NDCon _ n _ _ args)
242 | = case (dropAllNS !(full (gamma defs) n), args) of
243 | (UN (Basic "Nil"), _) => pure []
244 | (UN (Basic "::"), [_, (_, x), (_, xs)])
245 | => do x' <- reify defs !(evalClosure defs x)
246 | xs' <- reify defs !(evalClosure defs xs)
248 | _ => cantReify val "List"
249 | reify defs val = cantReify val "List"
252 | Reflect a => Reflect (List a) where
253 | reflect fc defs lhs env [] = appCon fc defs (basics "Nil") [Erased fc Placeholder]
254 | reflect fc defs lhs env (x :: xs)
255 | = do x' <- reflect fc defs lhs env x
256 | xs' <- reflect fc defs lhs env xs
257 | appCon fc defs (basics "::") [Erased fc Placeholder, x', xs']
260 | Reify a => Reify (List1 a) where
261 | reify defs val@(NDCon _ n _ _ [_, (_, x), (_, xs)])
262 | = case dropAllNS !(full (gamma defs) n) of
264 | => do x' <- reify defs !(evalClosure defs x)
265 | xs' <- reify defs !(evalClosure defs xs)
267 | _ => cantReify val "List1"
268 | reify defs val = cantReify val "List1"
271 | Reflect a => Reflect (List1 a) where
272 | reflect fc defs lhs env xxs
273 | = do x' <- reflect fc defs lhs env (head xxs)
274 | xs' <- reflect fc defs lhs env (tail xxs)
275 | appCon fc defs (NS (mkNamespace "Data.List1")
276 | (UN $
Basic ":::")) [Erased fc Placeholder, x', xs']
279 | Reify a => Reify (SnocList a) where
280 | reify defs val@(NDCon _ n _ _ args)
281 | = case (dropAllNS !(full (gamma defs) n), args) of
282 | (UN (Basic "Lin"), _) => pure [<]
283 | (UN (Basic ":<"), [_, (_, sx), (_, x)])
284 | => do sx' <- reify defs !(evalClosure defs sx)
285 | x' <- reify defs !(evalClosure defs x)
287 | _ => cantReify val "SnocList"
288 | reify defs val = cantReify val "SnocList"
291 | Reflect a => Reflect (SnocList a) where
292 | reflect fc defs lhs env [<] = appCon fc defs (basics "Lin") [Erased fc Placeholder]
293 | reflect fc defs lhs env (sx :< x)
294 | = do sx' <- reflect fc defs lhs env sx
295 | x' <- reflect fc defs lhs env x
296 | appCon fc defs (basics ":<") [Erased fc Placeholder, sx', x']
299 | Reify a => Reify (Maybe a) where
300 | reify defs val@(NDCon _ n _ _ args)
301 | = case (dropAllNS !(full (gamma defs) n), args) of
302 | (UN (Basic "Nothing"), _) => pure Nothing
303 | (UN (Basic "Just"), [_, (_, x)])
304 | => do x' <- reify defs !(evalClosure defs x)
306 | _ => cantReify val "Maybe"
307 | reify defs val = cantReify val "Maybe"
310 | Reflect a => Reflect (Maybe a) where
311 | reflect fc defs lhs env Nothing = appCon fc defs (preludetypes "Nothing") [Erased fc Placeholder]
312 | reflect fc defs lhs env (Just x)
313 | = do x' <- reflect fc defs lhs env x
314 | appCon fc defs (preludetypes "Just") [Erased fc Placeholder, x']
318 | Reify a => Reify (WithDefault a def) where
319 | reify defs val@(NDCon _ n _ _ args)
320 | = case (dropAllNS !(full (gamma defs) n), args) of
321 | (UN (Basic "DefaultedValue"), _) => pure defaulted
322 | (UN (Basic "SpecifiedValue"), [_, _, (_, x)])
323 | => do x' <- reify defs !(evalClosure defs x)
324 | pure (specified x')
325 | _ => cantReify val "WithDefault"
326 | reify defs val = cantReify val "WithDefault"
329 | Reflect a => Reflect (WithDefault a def) where
330 | reflect fc defs lhs env def
332 | (appCon fc defs (reflectionttimp "DefaultedValue") [Erased fc Placeholder, Erased fc Placeholder])
333 | (\x => do x' <- reflect fc defs lhs env x
334 | appCon fc defs (reflectionttimp "SpecifiedValue") [Erased fc Placeholder, Erased fc Placeholder, x'])
338 | (Reify a, Reify b) => Reify (a, b) where
339 | reify defs val@(NDCon _ n _ _ [_, _, (_, x), (_, y)])
340 | = case dropAllNS !(full (gamma defs) n) of
341 | UN (Basic "MkPair")
342 | => do x' <- reify defs !(evalClosure defs x)
343 | y' <- reify defs !(evalClosure defs y)
345 | _ => cantReify val "Pair"
346 | reify defs val = cantReify val "Pair"
349 | (Reflect a, Reflect b) => Reflect (a, b) where
350 | reflect fc defs lhs env (x, y)
351 | = do x' <- reflect fc defs lhs env x
352 | y' <- reflect fc defs lhs env y
353 | appCon fc defs (builtin "MkPair") [Erased fc Placeholder, Erased fc Placeholder, x', y']
356 | Reify Namespace where
357 | reify defs val@(NDCon _ n _ _ [(_, ns)])
358 | = case dropAllNS !(full (gamma defs) n) of
360 | => do ns' <- reify defs !(evalClosure defs ns)
361 | pure (unsafeFoldNamespace ns')
362 | _ => cantReify val "Namespace"
363 | reify defs val = cantReify val "Namespace"
366 | Reflect Namespace where
367 | reflect fc defs lhs env ns
368 | = do ns' <- reflect fc defs lhs env (unsafeUnfoldNamespace ns)
369 | appCon fc defs (reflectiontt "MkNS") [ns']
372 | Reify ModuleIdent where
373 | reify defs val@(NDCon _ n _ _ [(_, ns)])
374 | = case dropAllNS !(full (gamma defs) n) of
376 | => do ns' <- reify defs !(evalClosure defs ns)
377 | pure (unsafeFoldModuleIdent ns')
378 | _ => cantReify val "ModuleIdent"
379 | reify defs val = cantReify val "ModuleIdent"
382 | Reflect ModuleIdent where
383 | reflect fc defs lhs env ns
384 | = do ns' <- reflect fc defs lhs env (unsafeUnfoldModuleIdent ns)
385 | appCon fc defs (reflectiontt "MkMI") [ns']
388 | Reify UserName where
389 | reify defs val@(NDCon _ n _ _ args)
390 | = case (dropAllNS !(full (gamma defs) n), args) of
391 | (UN (Basic "Basic"), [(_, str)])
392 | => do str' <- reify defs !(evalClosure defs str)
394 | (UN (Basic "Field"), [(_, str)])
395 | => do str' <- reify defs !(evalClosure defs str)
397 | (UN (Basic "Underscore"), [])
400 | => cantReify val "Name, reifying it is unimplemented or intentionally internal"
401 | _ => cantReify val "Name, the name was not found in context"
402 | reify defs val = cantReify val "Name, value is not an NDCon interally"
405 | Reflect UserName where
406 | reflect fc defs lhs env (Basic x)
407 | = do x' <- reflect fc defs lhs env x
408 | appCon fc defs (reflectiontt "Basic") [x']
409 | reflect fc defs lhs env (Field x)
410 | = do x' <- reflect fc defs lhs env x
411 | appCon fc defs (reflectiontt "Field") [x']
412 | reflect fc defs lhs env Underscore
413 | = do appCon fc defs (reflectiontt "Underscore") []
417 | reify defs val@(NDCon _ n _ _ args)
418 | = case (dropAllNS !(full (gamma defs) n), args) of
419 | (UN (Basic "UN"), [(_, str)])
420 | => do str' <- reify defs !(evalClosure defs str)
422 | (UN (Basic "MN"), [(_, str), (_, i)])
423 | => do str' <- reify defs !(evalClosure defs str)
424 | i' <- reify defs !(evalClosure defs i)
426 | (UN (Basic "NS"), [(_, ns), (_, n)])
427 | => do ns' <- reify defs !(evalClosure defs ns)
428 | n' <- reify defs !(evalClosure defs n)
430 | (UN (Basic "DN"), [(_, str), (_, n)])
431 | => do str' <- reify defs !(evalClosure defs str)
432 | n' <- reify defs !(evalClosure defs n)
434 | (UN (Basic "Nested"), [(_, ix), (_, n)])
435 | => do ix' <- reify defs !(evalClosure defs ix)
436 | n' <- reify defs !(evalClosure defs n)
437 | pure (Nested ix' n')
438 | (UN (Basic "CaseBlock"), [(_, outer), (_, i)])
439 | => do outer' <- reify defs !(evalClosure defs outer)
440 | i' <- reify defs !(evalClosure defs i)
441 | pure (CaseBlock outer' i')
442 | (UN (Basic "WithBlock"), [(_, outer), (_, i)])
443 | => do outer' <- reify defs !(evalClosure defs outer)
444 | i' <- reify defs !(evalClosure defs i)
445 | pure (WithBlock outer' i')
447 | => cantReify val "Name, reifying it is unimplemented or intentionally internal"
448 | _ => cantReify val "Name, the name was not found in context"
449 | reify defs val = cantReify val "Name, value is not an NDCon interally"
453 | reflect fc defs lhs env (UN x)
454 | = do x' <- reflect fc defs lhs env x
455 | appCon fc defs (reflectiontt "UN") [x']
456 | reflect fc defs lhs env (MN x i)
457 | = do x' <- reflect fc defs lhs env x
458 | i' <- reflect fc defs lhs env i
459 | appCon fc defs (reflectiontt "MN") [x', i']
460 | reflect fc defs lhs env (NS ns n)
461 | = do ns' <- reflect fc defs lhs env ns
462 | n' <- reflect fc defs lhs env n
463 | appCon fc defs (reflectiontt "NS") [ns', n']
464 | reflect fc defs lhs env (DN str n)
465 | = do str' <- reflect fc defs lhs env str
466 | n' <- reflect fc defs lhs env n
467 | appCon fc defs (reflectiontt "DN") [str', n']
468 | reflect fc defs lhs env (Nested ix n)
469 | = do ix' <- reflect fc defs lhs env ix
470 | n' <- reflect fc defs lhs env n
471 | appCon fc defs (reflectiontt "Nested") [ix',n']
472 | reflect fc defs lhs env (CaseBlock outer i)
473 | = do outer' <- reflect fc defs lhs env outer
474 | i' <- reflect fc defs lhs env i
475 | appCon fc defs (reflectiontt "CaseBlock") [outer',i']
476 | reflect fc defs lhs env (WithBlock outer i)
477 | = do outer' <- reflect fc defs lhs env outer
478 | i' <- reflect fc defs lhs env i
479 | appCon fc defs (reflectiontt "WithBlock") [outer',i']
480 | reflect fc defs lhs env (Resolved i)
481 | = case !(full (gamma defs) (Resolved i)) of
482 | Resolved _ => cantReflect fc
483 | "Name directly, Resolved is intentionally internal"
484 | n => reflect fc defs lhs env n
485 | reflect fc defs lhs env n = cantReflect fc
486 | "Name, reflecting it is unimplemented or intentionally internal"
489 | Reify NameType where
490 | reify defs val@(NDCon _ n _ _ args)
491 | = case (dropAllNS !(full (gamma defs) n), args) of
492 | (UN (Basic "Bound"), _) => pure Bound
493 | (UN (Basic "Func"), _) => pure Func
494 | (UN (Basic "DataCon"), [(_, t), (_, i)])
495 | => do t' <- reify defs !(evalClosure defs t)
496 | i' <- reify defs !(evalClosure defs i)
497 | pure (DataCon t' i')
498 | (UN (Basic "TyCon"), [(_, i)])
499 | => do i' <- reify defs !(evalClosure defs i)
501 | _ => cantReify val "NameType"
502 | reify defs val = cantReify val "NameType"
505 | Reflect NameType where
506 | reflect fc defs lhs env Bound = getCon fc defs (reflectiontt "Bound")
507 | reflect fc defs lhs env Func = getCon fc defs (reflectiontt "Func")
508 | reflect fc defs lhs env (DataCon t i)
509 | = do t' <- reflect fc defs lhs env t
510 | i' <- reflect fc defs lhs env i
511 | appCon fc defs (reflectiontt "DataCon") [t', i']
512 | reflect fc defs lhs env (TyCon i)
513 | = do i' <- reflect fc defs lhs env i
514 | appCon fc defs (reflectiontt "TyCon") [PrimVal fc (I 0), i']
517 | Reify PrimType where
518 | reify defs val@(NDCon _ n _ _ args)
519 | = case (dropAllNS !(full (gamma defs) n), args) of
520 | (UN (Basic "IntType"), [])
522 | (UN (Basic "Int8Type"), [])
524 | (UN (Basic "Int16Type"), [])
526 | (UN (Basic "Int32Type"), [])
528 | (UN (Basic "Int64Type"), [])
530 | (UN (Basic "IntegerType"), [])
531 | => pure IntegerType
532 | (UN (Basic "Bits8Type"), [])
534 | (UN (Basic "Bits16Type"), [])
536 | (UN (Basic "Bits32Type"), [])
538 | (UN (Basic "Bits64Type"), [])
540 | (UN (Basic "StringType"), [])
542 | (UN (Basic "CharType"), [])
544 | (UN (Basic "DoubleType"), [])
546 | (UN (Basic "WorldType"), [])
548 | _ => cantReify val "PrimType"
549 | reify defs val = cantReify val "PrimType"
552 | Reify Constant where
553 | reify defs val@(NDCon _ n _ _ args)
554 | = case (dropAllNS !(full (gamma defs) n), args) of
555 | (UN (Basic "I"), [(_, x)])
556 | => do x' <- reify defs !(evalClosure defs x)
558 | (UN (Basic "I8"), [(_, x)])
559 | => do x' <- reify defs !(evalClosure defs x)
561 | (UN (Basic "I16"), [(_, x)])
562 | => do x' <- reify defs !(evalClosure defs x)
564 | (UN (Basic "I32"), [(_, x)])
565 | => do x' <- reify defs !(evalClosure defs x)
567 | (UN (Basic "I64"), [(_, x)])
568 | => do x' <- reify defs !(evalClosure defs x)
570 | (UN (Basic "BI"), [(_, x)])
571 | => do x' <- reify defs !(evalClosure defs x)
573 | (UN (Basic "B8"), [(_, x)])
574 | => do x' <- reify defs !(evalClosure defs x)
576 | (UN (Basic "B16"), [(_, x)])
577 | => do x' <- reify defs !(evalClosure defs x)
579 | (UN (Basic "B32"), [(_, x)])
580 | => do x' <- reify defs !(evalClosure defs x)
582 | (UN (Basic "B64"), [(_, x)])
583 | => do x' <- reify defs !(evalClosure defs x)
585 | (UN (Basic "Str"), [(_, x)])
586 | => do x' <- reify defs !(evalClosure defs x)
588 | (UN (Basic "Ch"), [(_, x)])
589 | => do x' <- reify defs !(evalClosure defs x)
591 | (UN (Basic "Db"), [(_, x)])
592 | => do x' <- reify defs !(evalClosure defs x)
594 | (UN (Basic "PrT"), [(_, x)])
595 | => do x' <- reify defs !(evalClosure defs x)
597 | (UN (Basic "WorldVal"), [])
599 | _ => cantReify val "Constant"
600 | reify defs val = cantReify val "Constant"
603 | Reflect PrimType where
604 | reflect fc defs lhs env IntType
605 | = getCon fc defs (reflectiontt "IntType")
606 | reflect fc defs lhs env Int8Type
607 | = getCon fc defs (reflectiontt "Int8Type")
608 | reflect fc defs lhs env Int16Type
609 | = getCon fc defs (reflectiontt "Int16Type")
610 | reflect fc defs lhs env Int32Type
611 | = getCon fc defs (reflectiontt "Int32Type")
612 | reflect fc defs lhs env Int64Type
613 | = getCon fc defs (reflectiontt "Int64Type")
614 | reflect fc defs lhs env IntegerType
615 | = getCon fc defs (reflectiontt "IntegerType")
616 | reflect fc defs lhs env Bits8Type
617 | = getCon fc defs (reflectiontt "Bits8Type")
618 | reflect fc defs lhs env Bits16Type
619 | = getCon fc defs (reflectiontt "Bits16Type")
620 | reflect fc defs lhs env Bits32Type
621 | = getCon fc defs (reflectiontt "Bits32Type")
622 | reflect fc defs lhs env Bits64Type
623 | = getCon fc defs (reflectiontt "Bits64Type")
624 | reflect fc defs lhs env StringType
625 | = getCon fc defs (reflectiontt "StringType")
626 | reflect fc defs lhs env CharType
627 | = getCon fc defs (reflectiontt "CharType")
628 | reflect fc defs lhs env DoubleType
629 | = getCon fc defs (reflectiontt "DoubleType")
630 | reflect fc defs lhs env WorldType
631 | = getCon fc defs (reflectiontt "WorldType")
634 | Reflect Constant where
635 | reflect fc defs lhs env (I x)
636 | = do x' <- reflect fc defs lhs env x
637 | appCon fc defs (reflectiontt "I") [x']
638 | reflect fc defs lhs env (I8 x)
639 | = do x' <- reflect fc defs lhs env x
640 | appCon fc defs (reflectiontt "I8") [x']
641 | reflect fc defs lhs env (I16 x)
642 | = do x' <- reflect fc defs lhs env x
643 | appCon fc defs (reflectiontt "I16") [x']
644 | reflect fc defs lhs env (I32 x)
645 | = do x' <- reflect fc defs lhs env x
646 | appCon fc defs (reflectiontt "I32") [x']
647 | reflect fc defs lhs env (I64 x)
648 | = do x' <- reflect fc defs lhs env x
649 | appCon fc defs (reflectiontt "I64") [x']
650 | reflect fc defs lhs env (BI x)
651 | = do x' <- reflect fc defs lhs env x
652 | appCon fc defs (reflectiontt "BI") [x']
653 | reflect fc defs lhs env (B8 x)
654 | = do x' <- reflect fc defs lhs env x
655 | appCon fc defs (reflectiontt "B8") [x']
656 | reflect fc defs lhs env (B16 x)
657 | = do x' <- reflect fc defs lhs env x
658 | appCon fc defs (reflectiontt "B16") [x']
659 | reflect fc defs lhs env (B32 x)
660 | = do x' <- reflect fc defs lhs env x
661 | appCon fc defs (reflectiontt "B32") [x']
662 | reflect fc defs lhs env (B64 x)
663 | = do x' <- reflect fc defs lhs env x
664 | appCon fc defs (reflectiontt "B64") [x']
665 | reflect fc defs lhs env (Str x)
666 | = do x' <- reflect fc defs lhs env x
667 | appCon fc defs (reflectiontt "Str") [x']
668 | reflect fc defs lhs env (Ch x)
669 | = do x' <- reflect fc defs lhs env x
670 | appCon fc defs (reflectiontt "Ch") [x']
671 | reflect fc defs lhs env (Db x)
672 | = do x' <- reflect fc defs lhs env x
673 | appCon fc defs (reflectiontt "Db") [x']
674 | reflect fc defs lhs env (PrT x)
675 | = do x' <- reflect fc defs lhs env x
676 | appCon fc defs (reflectiontt "PrT") [x']
677 | reflect fc defs lhs env WorldVal
678 | = getCon fc defs (reflectiontt "WorldVal")
681 | Reify Visibility where
682 | reify defs val@(NDCon _ n _ _ _)
683 | = case dropAllNS !(full (gamma defs) n) of
684 | UN (Basic "Private") => pure Private
685 | UN (Basic "Export") => pure Export
686 | UN (Basic "Public") => pure Public
687 | _ => cantReify val "Visibility"
688 | reify defs val = cantReify val "Visibility"
691 | Reflect Visibility where
692 | reflect fc defs lhs env Private = getCon fc defs (reflectiontt "Private")
693 | reflect fc defs lhs env Export = getCon fc defs (reflectiontt "Export")
694 | reflect fc defs lhs env Public = getCon fc defs (reflectiontt "Public")
697 | Reify TotalReq where
698 | reify defs val@(NDCon _ n _ _ _)
699 | = case dropAllNS !(full (gamma defs) n) of
700 | UN (Basic "Total") => pure Total
701 | UN (Basic "CoveringOnly") => pure CoveringOnly
702 | UN (Basic "PartialOK") => pure PartialOK
703 | _ => cantReify val "TotalReq"
704 | reify defs val = cantReify val "TotalReq"
707 | Reflect TotalReq where
708 | reflect fc defs lhs env Total = getCon fc defs (reflectiontt "Total")
709 | reflect fc defs lhs env CoveringOnly = getCon fc defs (reflectiontt "CoveringOnly")
710 | reflect fc defs lhs env PartialOK = getCon fc defs (reflectiontt "PartialOK")
713 | Reify RigCount where
714 | reify defs val@(NDCon _ n _ _ _)
715 | = case dropAllNS !(full (gamma defs) n) of
716 | UN (Basic "M0") => pure erased
717 | UN (Basic "M1") => pure linear
718 | UN (Basic "MW") => pure top
719 | _ => cantReify val "Count"
720 | reify defs val = cantReify val "Count"
723 | Reflect RigCount where
724 | reflect fc defs lhs env r
725 | = elimSemi (getCon fc defs (reflectiontt "M0"))
726 | (getCon fc defs (reflectiontt "M1"))
727 | (const (getCon fc defs (reflectiontt "MW")))
731 | Reify t => Reify (PiInfo t) where
732 | reify defs val@(NDCon _ n _ _ args)
733 | = case (dropAllNS !(full (gamma defs) n), args) of
734 | (UN (Basic "ImplicitArg"), _) => pure Implicit
735 | (UN (Basic "ExplicitArg"), _) => pure Explicit
736 | (UN (Basic "AutoImplicit"), _) => pure AutoImplicit
737 | (UN (Basic "DefImplicit"), [_, (_, t)])
738 | => do t' <- reify defs !(evalClosure defs t)
739 | pure (DefImplicit t')
740 | _ => cantReify val "PiInfo"
741 | reify defs val = cantReify val "PiInfo"
744 | Reflect t => Reflect (PiInfo t) where
745 | reflect fc defs lhs env Implicit
746 | = appCon fc defs (reflectiontt "ImplicitArg") [Erased fc Placeholder]
747 | reflect fc defs lhs env Explicit
748 | = appCon fc defs (reflectiontt "ExplicitArg") [Erased fc Placeholder]
749 | reflect fc defs lhs env AutoImplicit
750 | = appCon fc defs (reflectiontt "AutoImplicit") [Erased fc Placeholder]
751 | reflect fc defs lhs env (DefImplicit t)
752 | = do t' <- reflect fc defs lhs env t
753 | appCon fc defs (reflectiontt "DefImplicit") [Erased fc Placeholder, t']
756 | Reify LazyReason where
757 | reify defs val@(NDCon _ n _ _ _)
758 | = case dropAllNS !(full (gamma defs) n) of
759 | UN (Basic "LInf") => pure LInf
760 | UN (Basic "LLazy") => pure LLazy
761 | UN (Basic "LUnknown") => pure LUnknown
762 | _ => cantReify val "LazyReason"
763 | reify defs val = cantReify val "LazyReason"
766 | Reflect LazyReason where
767 | reflect fc defs lhs env LInf = getCon fc defs (reflectiontt "LInf")
768 | reflect fc defs lhs env LLazy = getCon fc defs (reflectiontt "LLazy")
769 | reflect fc defs lhs env LUnknown = getCon fc defs (reflectiontt "LUnknown")
772 | Reify VirtualIdent where
773 | reify defs val@(NDCon _ n _ _ args)
774 | = case (dropAllNS !(full (gamma defs) n), args) of
775 | (UN (Basic "Interactive"), [])
776 | => pure Interactive
777 | _ => cantReify val "VirtualIdent"
778 | reify defs val = cantReify val "VirtualIdent"
781 | Reflect BuiltinType where
782 | reflect fc defs lhs env BuiltinNatural
783 | = getCon fc defs (reflectiontt "BuiltinNatural")
784 | reflect fc defs lhs env NaturalToInteger
785 | = getCon fc defs (reflectiontt "NaturalToInteger")
786 | reflect fc defs lhs env IntegerToNatural
787 | = getCon fc defs (reflectiontt "IntegerToNatural")
790 | Reify BuiltinType where
791 | reify defs val@(NDCon _ n _ _ args)
792 | = case (dropAllNS !(full (gamma defs) n), args) of
793 | (UN (Basic "BuiltinNatural"), [])
794 | => pure BuiltinNatural
795 | (UN (Basic "NaturalToInteger"), [])
796 | => pure NaturalToInteger
797 | (UN (Basic "IntegerToNatural"), [])
798 | => pure IntegerToNatural
799 | _ => cantReify val "BuiltinType"
800 | reify defs val = cantReify val "BuiltinType"
803 | Reflect VirtualIdent where
804 | reflect fc defs lhs env Interactive
805 | = getCon fc defs (reflectiontt "Interactive")
808 | Reify OriginDesc where
809 | reify defs val@(NDCon _ n _ _ args)
810 | = case (dropAllNS !(full (gamma defs) n), args) of
811 | (UN (Basic "PhysicalIdrSrc"), [(_, ident)])
812 | => do ident' <- reify defs !(evalClosure defs ident)
813 | pure (PhysicalIdrSrc ident')
814 | (UN (Basic "PhysicalPkgSrc"), [(_, fname)])
815 | => do fname' <- reify defs !(evalClosure defs fname)
816 | pure (PhysicalPkgSrc fname')
817 | (UN (Basic "Virtual"), [(_, ident)])
818 | => do ident' <- reify defs !(evalClosure defs ident)
819 | pure (Virtual ident')
820 | _ => cantReify val "OriginDesc"
821 | reify defs val = cantReify val "OriginDesc"
824 | Reflect OriginDesc where
825 | reflect fc defs lhs env (PhysicalIdrSrc ident)
826 | = do ident' <- reflect fc defs lhs env ident
827 | appCon fc defs (reflectiontt "PhysicalIdrSrc") [ident']
828 | reflect fc defs lhs env (PhysicalPkgSrc fname)
829 | = do fname' <- reflect fc defs lhs env fname
830 | appCon fc defs (reflectiontt "PhysicalPkgSrc") [fname']
831 | reflect fc defs lhs env (Virtual ident)
832 | = do ident' <- reflect fc defs lhs env ident
833 | appCon fc defs (reflectiontt "Virtual") [ident']
837 | reify defs val@(NDCon _ n _ _ args)
838 | = case (dropAllNS !(full (gamma defs) n), args) of
839 | (UN (Basic "MkFC"), [(_, fn), (_, start), (_, end)])
840 | => do fn' <- reify defs !(evalClosure defs fn)
841 | start' <- reify defs !(evalClosure defs start)
842 | end' <- reify defs !(evalClosure defs end)
843 | pure (MkFC fn' start' end')
844 | (UN (Basic "EmptyFC"), _) => pure EmptyFC
845 | _ => cantReify val "FC"
846 | reify defs val = cantReify val "FC"
850 | reflect fc defs True env _ = pure $
Erased fc Placeholder
851 | reflect fc defs lhs env (MkFC fn start end)
852 | = do fn' <- reflect fc defs lhs env fn
853 | start' <- reflect fc defs lhs env start
854 | end' <- reflect fc defs lhs env end
855 | appCon fc defs (reflectiontt "MkFC") [fn', start', end']
856 | reflect fc defs lhs env (MkVirtualFC fn start end)
857 | = do fn' <- reflect fc defs lhs env fn
858 | start' <- reflect fc defs lhs env start
859 | end' <- reflect fc defs lhs env end
860 | appCon fc defs (reflectiontt "MkFC") [fn', start', end']
861 | reflect fc defs lhs env EmptyFC = getCon fc defs (reflectiontt "EmptyFC")
864 | Reify a => Reify (WithFC a) where
865 | reify defs val@(NDCon _ n _ _ args)
866 | = case (dropAllNS !(full (gamma defs) n), map snd args) of
867 | (UN (Basic "MkFCVal"), [fcterm, nestedVal]) => do
868 | fc <- reify defs !(evalClosure defs fcterm)
869 | val <- reify defs !(evalClosure defs nestedVal)
870 | pure $
MkFCVal fc val
871 | (UN (Basic "MkFCVal"), [_, fc, l2]) => do
872 | fc' <- reify defs !(evalClosure defs fc)
873 | val' <- reify defs !(evalClosure defs l2)
874 | pure $
MkFCVal fc' val'
875 | (t, l) => cantReify val "WithFC constructor: \{show t}, args: \{show (length l)}"
876 | reify defs val = cantReify val "Expected WithFC, found something else"
879 | Reflect a => Reflect (WithFC a) where
880 | reflect fc defs lhs env value
881 | = do loc' <- reflect fc defs lhs env value.fc
882 | val' <- reflect fc defs lhs env value.val
883 | appCon fc defs (reflectiontt "MkFCVal") [Erased fc Placeholder, loc', val']