module Graphics.Text.Font.Choose.Range(Range(..), iRange) where import Data.MessagePack (MessagePack(..), Object(..)) import qualified Data.Vector as V import qualified Data.IntMap as IM -- | Matches a numeric range. data Range = Range Double Double deriving (Eq, Show, Ord) -- | Matches an integral range. iRange :: Int -> Int -> Range iRange i j = toEnum i `Range` toEnum j instance MessagePack Range where toObject (Range start end) = ObjectMap $ V.fromList [ (ObjectInt 0, ObjectDouble start), (ObjectInt 1, ObjectDouble end) ] fromObject msg | Just msg' <- fromObject msg = Just (IM.findWithDefault 0 0 msg' `Range` IM.findWithDefault 0 1 msg') | otherwise = Nothing