packages feed

idris-0.9.9.3: lib/Prelude/Bits.idr

module Prelude.Bits

import Prelude.Strings
import Prelude.Vect

%access public
%default total


private
toHexDigit : Fin 16 -> Char
toHexDigit n = index n hexVect where
  hexVect : Vect 16 Char
  hexVect = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
             'A', 'B', 'C', 'D', 'E', 'F']

b8ToString : Bits8 -> String
b8ToString c = pack [c1, c2] where
  %assert_total -- We will only supply numbers that can fit in 4 bits
  toFin16 : Bits8 -> Fin 16
  toFin16 n = if n == 0
                 then fZ
                 else believe_me (fS (toFin16 (n-1)))
  c1 = toHexDigit upper where
    upper : Fin 16
    upper = toFin16 (prim__lshrB8 c 4)
  c2 = toHexDigit lower where
    lower : Fin 16
    lower = toFin16 (prim__andB8 c 0xf)

b16ToString : Bits16 -> String
b16ToString c = c1 ++ c2 where
  c1 = b8ToString upper where
    upper : Bits8
    upper = prim__truncB16_B8 (prim__lshrB16 c 8)
  c2 = b8ToString lower where
    lower : Bits8
    lower = prim__truncB16_B8 c

b32ToString : Bits32 -> String
b32ToString c = c1 ++ c2 where
  c1 = b16ToString upper where
    upper : Bits16
    upper = prim__truncB32_B16 (prim__lshrB32 c 16)
  c2 = b16ToString lower where
    lower : Bits16
    lower = prim__truncB32_B16 c

b64ToString : Bits64 -> String
b64ToString c = c1 ++ c2 where
  c1 = b32ToString upper where
    upper : Bits32
    upper = prim__truncB64_B32 (prim__lshrB64 c 32)
  c2 = b32ToString lower where
    lower : Bits32
    lower = prim__truncB64_B32 c