6 data Ord a => SubRange a = SubRange (a, a) a
8 type IntSubRange = SubRange Int
11 subRangeValue :: SubRange a -> a
12 subRangeValue (SubRange (lower, upper) value) = value
14 subRange :: SubRange a -> (a, a)
15 subRange (SubRange r value) = r
17 newRange :: (Ord a, Text a) => (a, a) -> a -> SubRange a
18 newRange r value = checkRange (SubRange r value)
21 checkRange :: (Ord a, Text a) => SubRange a -> SubRange a
22 checkRange (SubRange (lower, upper) value)
23 = if (value < lower) || (value > upper) then
24 error ("### sub range error. range = " ++ show lower ++
25 ".." ++ show upper ++ " value = " ++ show value ++ "\n")
27 SubRange (lower, upper) value
30 instance Eq a => Eq (SubRange a) where
31 (==) a b = subRangeValue a == subRangeValue b
33 instance (Ord a) => Ord (SubRange a) where
39 relOp :: Ord a => (a->a->Bool) -> SubRange a -> SubRange a -> Bool
40 relOp op a b = (subRangeValue a) `op` (subRangeValue b)
42 rangeOf :: (Ord a, Text a) => SubRange a -> SubRange a -> SubRange a
43 rangeOf a b = checkRange (SubRange (subRange b) (subRangeValue a))
45 showRange :: Text a => SubRange a -> String
46 showRange (SubRange (lower, upper) value)
47 = show value ++ " :" ++ show lower ++ ".." ++ show upper
49 showRangePair :: (Text a, Text b) => (SubRange a, SubRange b) -> String
51 = "(" ++ showRange a ++ ", " ++ showRange b ++ ")"
53 showRangeTriple :: (Text a, Text b, Text c) =>
54 (SubRange a, SubRange b, SubRange c) -> String
55 showRangeTriple (a, b, c)
56 = "(" ++ showRange a ++ ", " ++ showRange b ++ ", " ++ showRange c ++ ")"
60 instance Num a => Num (SubRange a) where
61 negate = numSubRangeNegate
63 (-) = numSubRangeSubtract
64 (*) = numSubRangeMultiply
65 fromInteger a = SubRange (fromInteger a, fromInteger a) (fromInteger a)
67 numSubRangeNegate :: (Ord a, Num a) => SubRange a -> SubRange a
68 numSubRangeNegate (SubRange (lower, upper) value)
69 = checkRange (SubRange (lower, upper) (-value))
71 numSubRangeBinOp :: Num a => (a -> a -> a) ->
72 SubRange a -> SubRange a -> SubRange a
73 numSubRangeBinOp op a b
74 = SubRange (result, result) result
76 result = (subRangeValue a) `op` (subRangeValue b)
79 numSubRangeAdd, numSubRangeSubtract, numSubRangeMultiply :: Num a => SubRange a -> SubRange a -> SubRange a
81 numSubRangeAdd = numSubRangeBinOp (+)
82 numSubRangeSubtract = numSubRangeBinOp (-)
83 numSubRangeMultiply = numSubRangeBinOp (*)
85 unsignedBits :: Int -> (Int, Int)
86 unsignedBits n = (0, 2^n-1)
88 signedBits :: Int -> (Int, Int)
89 signedBits n = (-2^(n-1), 2^(n-1)-1)
92 si_n :: Int -> Int -> IntSubRange
93 si_n bits value = SubRange (signedBits bits) value
95 si8, si10, si16 :: Int -> IntSubRange