{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-orphans #-} {-| This module provides a generalized conversion function between a 'Flake' and all members of the typeclass 'Integral'. It is specialized for the 'Integer', 'Word32', and 'Word64' types. It is marked as incoherent due to the constraint being no smaller than the instance type, so it is undecidable. -} module Data.Snowchecked.Encoding.Integral ( module Data.Snowchecked.Encoding.Class ) where import Data.Snowchecked.Encoding.Class import Data.Snowchecked.Internal.Import instance {-# INCOHERENT #-} (Integral a) => IsFlake a where fromFlake Flake{..} = fromInteger $ cutBits checkInteger checkBitsInteger .|. cutShiftBits nodeIdInteger nodeBitsInteger checkBitsInteger .|. cutShiftBits countInteger countBitsInteger (checkBitsInteger + nodeBitsInteger) .|. cutShiftBits timeInteger timeBitsInteger (checkBitsInteger + nodeBitsInteger + countBitsInteger) where SnowcheckedConfig{..} = flakeConfig checkBitsInteger = toInteger confCheckBits nodeBitsInteger = toInteger confNodeBits timeBitsInteger = toInteger confTimeBits countBitsInteger = toInteger confCountBits nodeIdInteger = toInteger flakeNodeId timeInteger = toInteger flakeTime countInteger = toInteger flakeCount checkInteger = nodeIdInteger + timeInteger + countInteger {-# INLINEABLE fromFlake #-} parseFish SnowcheckedConfig{..} i = return $ Flakeish { fishCheck = fromIntegral $ cutBits n checkBitsInteger , fishNodeId = fromIntegral $ shiftCutBits n checkBitsInteger nodeBitsInteger , fishCount = fromIntegral $ shiftCutBits n (checkBitsInteger + nodeBitsInteger) countBitsInteger , fishTime = fromIntegral $ shiftCutBits n (checkBitsInteger + nodeBitsInteger + countBitsInteger) timeBitsInteger } where n = toInteger i checkBitsInteger = toInteger confCheckBits nodeBitsInteger = toInteger confNodeBits timeBitsInteger = toInteger confTimeBits countBitsInteger = toInteger confCountBits {-# INLINE parseFish #-}