@@ -308,6 +308,14 @@ def higherOrderLiteralFolders : List (Name × Folder) := [
308308def Folder.mulShift [Literal α] [BEq α] (shiftLeft : Name) (pow2 : α → α) (log2 : α → α) : Folder :=
309309 Folder.first #[Folder.mulLhsShift shiftLeft pow2 log2, Folder.mulRhsShift shiftLeft pow2 log2]
310310
311+ /--
312+ Folder for ofNat operations on fixed-sized integer types.
313+ -/
314+ def Folder.ofNat (f : Nat → LitValue) (args : Array Arg): FolderM (Option LetValue) := do
315+ let #[.fvar fvarId] := args | return none
316+ let some value ← getNatLit fvarId | return none
317+ return some (.lit (f value))
318+
311319/--
312320All arithmetic folders.
313321-/
@@ -355,6 +363,13 @@ def relationFolders : List (Name × Folder) := [
355363 (``Bool.decEq, Folder.mkBinaryDecisionProcedure String.decEq)
356364]
357365
366+ def conversionFolders : List (Name × Folder) := [
367+ (``UInt8.ofNat, Folder.ofNat (fun v => .uint8 (UInt8.ofNat v))),
368+ (``UInt16.ofNat, Folder.ofNat (fun v => .uint16 (UInt16.ofNat v))),
369+ (``UInt32.ofNat, Folder.ofNat (fun v => .uint32 (UInt32.ofNat v))),
370+ (``UInt64.ofNat, Folder.ofNat (fun v => .uint64 (UInt64.ofNat v))),
371+ ]
372+
358373/--
359374All string folders.
360375-/
@@ -387,7 +402,7 @@ private def getFolder (declName : Name) : CoreM Folder := do
387402 ofExcept <| getFolderCore (← getEnv) (← getOptions) declName
388403
389404def builtinFolders : SMap Name Folder :=
390- (arithmeticFolders ++ relationFolders ++ higherOrderLiteralFolders ++ stringFolders).foldl (init := {}) fun s (declName, folder) =>
405+ (arithmeticFolders ++ relationFolders ++ conversionFolders ++ higherOrderLiteralFolders ++ stringFolders).foldl (init := {}) fun s (declName, folder) =>
391406 s.insert declName folder
392407
393408structure FolderOleanEntry where
0 commit comments