module Data.Binary.Conversion.Fast where

-- This module provides a conversion function from
-- nats which uses built-in functions.
-- It is dramatically faster than the normal conversion
-- even at smaller numbers.

open import Data.Binary.Definition
open import Data.Binary.Helpers

⟦_⇑⟧⟨_⟩ :     𝔹
 suc n ⇑⟧⟨ suc w  =
  if even n
    then 1ᵇ  div2 n ⇑⟧⟨ w 
    else 2ᵇ  div2 n ⇑⟧⟨ w 
 zero  ⇑⟧⟨ _     = 0ᵇ
 suc _ ⇑⟧⟨ zero  = 0ᵇ -- will not happen

-- We build the output by repeatedly halving the input,
-- but we also pass in the number to reduce as we go so that
-- we satisfy the termination checker.
⟦_⇑⟧ :   𝔹
 n ⇑⟧ =  n ⇑⟧⟨ n 
{-# INLINE ⟦_⇑⟧ #-}