Base64 Encoding in Idris
Our program demonstrates base64 encoding and decoding in Idris. Here’s the full source code:
module Main
import Data.String
import Data.Buffer
import Data.Buffer.Encode
main : IO ()
main = do
let data = "abc123!?$*&()'-=@~"
-- Standard base64 encoding
let sEnc = base64Encode data
putStrLn sEnc
-- Standard base64 decoding
case base64Decode sEnc of
Right sDec -> putStrLn $ fastUnpack sDec
Left err -> putStrLn $ "Decoding error: " ++ err
putStrLn ""
-- URL-safe base64 encoding
let uEnc = base64UrlEncode data
putStrLn uEnc
-- URL-safe base64 decoding
case base64UrlDecode uEnc of
Right uDec -> putStrLn $ fastUnpack uDec
Left err -> putStrLn $ "Decoding error: " ++ err
where
base64Encode : String -> String
base64Encode = fastPack . encode Base64 . fastPack
base64Decode : String -> Either String Buffer
base64Decode = decode Base64 . fastPack
base64UrlEncode : String -> String
base64UrlEncode = fastPack . encode Base64Url . fastPack
base64UrlDecode : String -> Either String Buffer
base64UrlDecode = decode Base64Url . fastPackThis program uses the Data.Buffer.Encode module, which provides functions for base64 encoding and decoding. Here’s a breakdown of what the code does:
We define a string that we’ll encode and decode.
We use
base64Encodeto perform standard base64 encoding. This function converts the string to a buffer, encodes it, and then converts the result back to a string.For decoding, we use
base64Decode. This function returns anEither String Buffer, whereLeftcontains an error message if decoding fails, andRightcontains the decoded buffer if successful.We repeat the process with
base64UrlEncodeandbase64UrlDecodefor URL-safe base64 encoding and decoding.The
fastPackandfastUnpackfunctions are used to convert betweenStringandBuffertypes efficiently.
To run the program, save it as Base64Encoding.idr and use the Idris compiler:
$ idris Base64Encoding.idr -o base64_encoding
$ ./base64_encoding
YWJjMTIzIT8kKiYoKSctPUB+
abc123!?$*&()'-=@~
YWJjMTIzIT8kKiYoKSctPUB-
abc123!?$*&()'-=@~The output shows that both standard and URL-safe base64 encoding produce slightly different results (note the trailing + vs -), but both decode back to the original string as expected.
In Idris, error handling is typically done using the Either type, which we’ve used here for the decoding functions. This allows for more explicit error handling compared to some other languages.