{-# LANGUAGE BinaryLiterals #-} {-# LANGUAGE NoImplicitPrelude #-} module Codec.QRCode.Mode.ECI ( eci ) where import Codec.QRCode.Base import qualified Codec.QRCode.Data.ByteStreamBuilder as BSB import Codec.QRCode.Data.QRSegment.Internal import Codec.QRCode.Data.Result -- | Generate a segment representing an Extended Channel Interpretation -- (ECI) designator with the specified assignment value. eci :: Int -> Result QRSegment eci = fmap constStream . eciB eciB :: Int -> Result BSB.ByteStreamBuilder eciB n | n < 0 = empty | n < 0x80 = pure $ BSB.encodeBits 4 0b0111 <> BSB.encodeBits 8 n | n < 0x4000 = pure $ BSB.encodeBits 4 0b0111 <> BSB.encodeBits 2 0b10 <> BSB.encodeBits (2*8-2) n | n < 1000000 = pure $ BSB.encodeBits 4 0b0111 <> BSB.encodeBits 3 0b110 <> BSB.encodeBits (3*8-3) n | otherwise = empty