module TestBuffer

import Data.Buffer
import System.File

put : Show a => IO a -> IO ()
put = (>>= putStrLn . show)

main : IO ()
main = do
    Just buf <- newBuffer 31
        | Nothing => pure ()

    setByte buf 0 1
    setBits8 buf 1 2
    setInt buf 2 0x1122334455667788
    setDouble buf 10 (sqrt 2)

    let helloWorld = "Hello, world"

    Just helloWorldBuf <- newBuffer (stringByteLength helloWorld)
        | Nothing => pure ()

    setString helloWorldBuf 0 "Hello, world"
    copyData helloWorldBuf 0 12 buf 18

    put $ rawSize buf

    put $ getByte buf 0
    put $ getBits8 buf 1
    put $ getInt buf 2
    put $ getDouble buf 10
    put $ getString buf 18 12

    put $ bufferData buf

    Just readBuf <- newBuffer 8
        | Nothing => pure ()
    Right f <- openFile "testRead.buf" Read
        | Left err => put $ pure err
    Right () <- readBufferData f readBuf 0 8
        | Left err => put $ pure err
    put $ bufferData readBuf

    Just writeBuf <- newBuffer 8
        | Nothing => pure ()
    setInt writeBuf 0 0x7766554433221100
    Right f <- openFile "testWrite.buf" WriteTruncate
        | Left err => put $ pure err
    Right () <- writeBufferData f writeBuf 0 8
        | Left err => put $ pure err

    pure ()
