{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module File.Binary.Instances.BigEndian (
	intToWords
) where

import File.Binary.Classes
import qualified Data.ByteString.Lazy as BSL
import Data.Word

instance Field Int where
	type FieldArgument Int = Int
	fromBinary n s = (
		wordsToInt $ BSL.unpack $ fst $ getBytes n s,
		snd $ getBytes n s
	 )
--	toBinary n = makeBinary . BSLC.pack . reverse . lintToBin n . fromIntegral
	toBinary n = makeBinary . BSL.pack . intToWords n

wordsToInt :: Integral i => [Word8] -> i
wordsToInt = foldl (\i w -> i * 256 + fromIntegral w) 0

intToWords :: Integral i => Int -> i -> [Word8]
intToWords = itw []
	where
	itw result 0 _ = result
	itw result n i =
		itw (fromIntegral (i `mod` 256) : result) (n - 1) (i `div` 256)

instance Field Integer where
	type FieldArgument Integer = Int
	fromBinary n s = (
		wordsToInt $ BSL.unpack $ fst $ getBytes n s,
		snd $ getBytes n s
	 )
--	toBinary n = makeBinary . BSLC.pack . reverse . lintToBin n . fromIntegral
	toBinary n = makeBinary . BSL.pack . intToWords n