0 | module Hedgehog.Internal.Util
15 | interface Neg a => SafeDiv (0 a : Type) (0 pred : a -> Type) | a where
16 | total safeDiv' : (n,d : a) -> (0 prf : pred d) -> a
19 | SafeDiv Int (\d => d == 0 = False) where
20 | safeDiv' n d _ = n `div` d
23 | SafeDiv Integer (\d => d == 0 = False) where
24 | safeDiv' n d _ = n `div` d
27 | SafeDiv Double (\d => d == 0 = False) where
28 | safeDiv' n d _ = n / d
31 | safeDiv : SafeDiv a pred => (n,d : a) -> {auto 0 ok : pred d} -> a
32 | safeDiv n d = safeDiv' n d ok
35 | fromPred : (a -> Bool) -> a -> Maybe a
36 | fromPred p a = guard (p a) $> a
43 | interface Num a => ToInteger a where
44 | toInteger : a -> Integer
47 | toNat = integerToNat . toInteger
50 | ToInteger Integer where toInteger = id
53 | ToInteger Int8 where toInteger = cast
56 | ToInteger Int16 where toInteger = cast
59 | ToInteger Int32 where toInteger = cast
62 | ToInteger Int64 where toInteger = cast
65 | ToInteger Int where toInteger = cast
68 | ToInteger Bits8 where toInteger = cast
71 | ToInteger Bits16 where toInteger = cast
74 | ToInteger Bits32 where toInteger = cast
77 | ToInteger Bits64 where toInteger = cast
85 | ToInteger Double where toInteger = cast
88 | fromIntegral : ToInteger a => Num b => a -> b
89 | fromIntegral = fromInteger . toInteger
92 | round : Num a => Double -> a
95 | v' := if v - f < 0.5 then f else ceiling v
96 | in fromInteger $
cast v'
103 | iterateBefore : (p : a -> Bool) -> (a -> a) -> (v : a) -> Colist a
104 | iterateBefore p f = takeBefore p . iterate f
107 | iterateBefore0 : Eq a => Num a => (a -> a) -> (start : a) -> Colist a
108 | iterateBefore0 = iterateBefore (0 ==)
113 | prepRev : List a -> List a -> List a
115 | prepRev (x :: xs) ys = prepRev xs (x :: ys)
118 | signum : Ord a => Neg a => a -> a
120 | if x < 0 then (-
1) else if x == 0 then 0 else 1
127 | public export total
128 | consNub : Eq a => a -> Colist a -> Colist a
130 | consNub x l@(y :: xs) = if x == y then l else x :: l
133 | concatColist : Colist (Colist a) -> Colist a
134 | concatColist ((x :: xs) :: ys) = x :: concatColist (xs :: ys)
135 | concatColist ([] :: (x :: xs) :: ys) = x :: concatColist (xs :: ys)
136 | concatColist _ = []
139 | concatMapColist : (a -> Colist b) -> Colist a -> Colist b
140 | concatMapColist f = concatColist . map f
143 | fromFoldable : Foldable f => f a -> Colist a
144 | fromFoldable = fromList . toList