:: { UG:U<>, UD:U<Data>, UI:U<Image>, UT:U<Text>, Im1:u1[*,*,*], QIm1:u1[*,*,*]?, Im4:u4[*,*], B:u1[*], QB:u1[*]?, b:b, i8:i8, s:s, r8:r8 }
::+ { Tab:{A:i8, B:s}*, QTab:{A:i8, B:s}?*, GTab:{A:i8, B:g}*, ETab:{}*, NTab:(i8,s)* }

ReadBytes(UG)
ReadBytes(UD)
ReadBytes(UI)
ReadBytes(UT)

ReadByteBlocks(UG)
ReadByteBlocks(UD)
ReadByteBlocks(UI)
ReadByteBlocks(UT)

ReadByteBlocks(UG, 0x1000)
ReadByteBlocks(UD, 0x1000)
ReadByteBlocks(UI, 0x1000)
ReadByteBlocks(UT, 0x1000)

ReadRbin(UG)
ReadRbin(UD)
ReadRbin(UI)
ReadRbin(UT)

ReadParquet(UG)
ReadParquet(UD)
ReadParquet(UI)
ReadParquet(UT)

ReadText(UG)
ReadText(UD)
ReadText(UI)
ReadText(UT)

ReadLines(UG)
ReadLines(UD)
ReadLines(UI)
ReadLines(UT)

// These are functions, not procedures, but follow the same read/write arg validation.
ReadAll(UG)
ReadAll(UD)
ReadAll(UI)
ReadAll(UT)

ReadPixels(UG)
ReadPixels(UD)
ReadPixels(UI)
ReadPixels(UT)

WriteRbin(Tab, UG)
WriteRbin(Tab, UD)
WriteRbin(Tab, UI)
WriteRbin(Tab, UT)

WriteParquet(Tab, UG)
WriteParquet(Tab, UD)
WriteParquet(Tab, UI)
WriteParquet(Tab, UT)

WriteRbin(QTab, UD)
WriteRbin(ETab, UD)
WriteRbin(GTab, UD)
WriteRbin(NTab, UD)

WriteParquet(QTab, UD)
WriteParquet(ETab, UD)
WriteParquet(GTab, UD)
WriteParquet(NTab, UD)

WriteRbin(Tab, UD, b)
WriteRbin(Tab, UD, i8)
WriteRbin(Tab, UD, b, b)
WriteRbin(Tab, UD, b, i8)
WriteRbin(Tab, UD, b, s)
WriteRbin(Tab, UD, b, r8)

ListFiles()
ListFiles(UG)
ListFiles(UD)
ListFiles(UI)
ListFiles(UT)

WriteBytes(B, UG)
WriteBytes(B, UD)
WriteBytes(B, UI)
WriteBytes(B, UT)
WriteBytes(QB, UG)
WriteBytes(QB, UD)
WriteBytes(QB, UI)
WriteBytes(QB, UT)

WritePng(Im1, UG)
WritePng(Im1, UD)
WritePng(Im1, UI)
WritePng(Im1, UT)
WritePng(Im4, UG)
WritePng(Im4, UD)
WritePng(Im4, UI)
WritePng(Im4, UT)
WritePng(QIm1, UG)
WritePng(QIm1, UD)
WritePng(QIm1, UI)
WritePng(QIm1, UT)
WritePng(B, UI)
