{-# LANGUAGE DeriveGeneric #-}
module Graphics.Text.Font.Choose.Range(Range(..), iRange, validRange) where
import Data.MessagePack (MessagePack(..), Object(..))
import Test.QuickCheck (Arbitrary(..))
import GHC.Generics (Generic(..))
import Data.Hashable (Hashable(..))
import qualified Data.Vector as V
import qualified Data.IntMap as IM
data Range = Range Double Double deriving (Range -> Range -> Bool
(Range -> Range -> Bool) -> (Range -> Range -> Bool) -> Eq Range
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Range -> Range -> Bool
== :: Range -> Range -> Bool
$c/= :: Range -> Range -> Bool
/= :: Range -> Range -> Bool
Eq, ReadPrec [Range]
ReadPrec Range
Int -> ReadS Range
ReadS [Range]
(Int -> ReadS Range)
-> ReadS [Range]
-> ReadPrec Range
-> ReadPrec [Range]
-> Read Range
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Range
readsPrec :: Int -> ReadS Range
$creadList :: ReadS [Range]
readList :: ReadS [Range]
$creadPrec :: ReadPrec Range
readPrec :: ReadPrec Range
$creadListPrec :: ReadPrec [Range]
readListPrec :: ReadPrec [Range]
Read, Int -> Range -> ShowS
[Range] -> ShowS
Range -> String
(Int -> Range -> ShowS)
-> (Range -> String) -> ([Range] -> ShowS) -> Show Range
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Range -> ShowS
showsPrec :: Int -> Range -> ShowS
$cshow :: Range -> String
show :: Range -> String
$cshowList :: [Range] -> ShowS
showList :: [Range] -> ShowS
Show, Eq Range
Eq Range
-> (Range -> Range -> Ordering)
-> (Range -> Range -> Bool)
-> (Range -> Range -> Bool)
-> (Range -> Range -> Bool)
-> (Range -> Range -> Bool)
-> (Range -> Range -> Range)
-> (Range -> Range -> Range)
-> Ord Range
Range -> Range -> Bool
Range -> Range -> Ordering
Range -> Range -> Range
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Range -> Range -> Ordering
compare :: Range -> Range -> Ordering
$c< :: Range -> Range -> Bool
< :: Range -> Range -> Bool
$c<= :: Range -> Range -> Bool
<= :: Range -> Range -> Bool
$c> :: Range -> Range -> Bool
> :: Range -> Range -> Bool
$c>= :: Range -> Range -> Bool
>= :: Range -> Range -> Bool
$cmax :: Range -> Range -> Range
max :: Range -> Range -> Range
$cmin :: Range -> Range -> Range
min :: Range -> Range -> Range
Ord, (forall x. Range -> Rep Range x)
-> (forall x. Rep Range x -> Range) -> Generic Range
forall x. Rep Range x -> Range
forall x. Range -> Rep Range x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Range -> Rep Range x
from :: forall x. Range -> Rep Range x
$cto :: forall x. Rep Range x -> Range
to :: forall x. Rep Range x -> Range
Generic)
iRange :: Int -> Int -> Range
iRange :: Int -> Int -> Range
iRange Int
i Int
j = Int -> Double
forall a. Enum a => Int -> a
toEnum Int
i Double -> Double -> Range
`Range` Int -> Double
forall a. Enum a => Int -> a
toEnum Int
j
instance MessagePack Range where
toObject :: Range -> Object
toObject (Range Double
start Double
end) = Vector (Object, Object) -> Object
ObjectMap (Vector (Object, Object) -> Object)
-> Vector (Object, Object) -> Object
forall a b. (a -> b) -> a -> b
$ [(Object, Object)] -> Vector (Object, Object)
forall a. [a] -> Vector a
V.fromList [
(Int -> Object
ObjectInt Int
0, Double -> Object
ObjectDouble Double
start),
(Int -> Object
ObjectInt Int
1, Double -> Object
ObjectDouble Double
end)
]
fromObject :: Object -> Maybe Range
fromObject Object
msg
| Just IntMap Double
msg' <- Object -> Maybe (IntMap Double)
forall a. MessagePack a => Object -> Maybe a
fromObject Object
msg =
Range -> Maybe Range
forall a. a -> Maybe a
Just (Double -> Int -> IntMap Double -> Double
forall a. a -> Int -> IntMap a -> a
IM.findWithDefault Double
0 Int
0 IntMap Double
msg' Double -> Double -> Range
`Range` Double -> Int -> IntMap Double -> Double
forall a. a -> Int -> IntMap a -> a
IM.findWithDefault Double
0 Int
1 IntMap Double
msg')
| Bool
otherwise = Maybe Range
forall a. Maybe a
Nothing
instance Arbitrary Range where
arbitrary :: Gen Range
arbitrary = do
(Double
a, Double
b) <- Gen (Double, Double)
forall a. Arbitrary a => Gen a
arbitrary
Range -> Gen Range
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (Range -> Gen Range) -> Range -> Gen Range
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Range
Range Double
a (Double -> Range) -> Double -> Range
forall a b. (a -> b) -> a -> b
$ Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double -> Double
forall a. Num a => a -> a
abs Double
b Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
1
instance Hashable Range
validRange :: Range -> Bool
validRange :: Range -> Bool
validRange (Range Double
start Double
end) = Double
start Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
end