strict tuples, ordered lists, etc
[maximus:graphgrow.git] / Fractal / GraphGrow / Utils.hs
1 module Fractal.GraphGrow.Utils
2   ( -- * Miscellaneous maths.
3     sum'
4   , sqr
5   , clamp
6   , roundUpTwo
7     -- * Strict tuples.
8   , STwo(..)
9   , SThree(..)
10     -- * Ordered lists.
11   , mergeSortedBy
12   , mergeSortedsBy
13   ) where
14
15 import Data.List (foldl')
16
17 sum' :: Num a => [a] -> a
18 sum' = foldl' (+) 0
19
20 sqr :: Num a => a -> a
21 sqr a = a * a
22
23 clamp :: Ord a => a -> a -> a -> a
24 clamp x mi ma = mi `max` x `min` ma
25
26 roundUpTwo :: (Num a, Ord a) => a -> a
27 roundUpTwo n = head . dropWhile (< n) . iterate (2 *) $ 1
28
29 data STwo a b = STwo{ fstTwo :: !a, sndTwo :: !b }
30   deriving (Read, Show, Eq, Ord)
31
32 data SThree a b c = SThree{ fstThree :: !a, sndThree :: !b, thdThree :: !c }
33   deriving (Read, Show, Eq, Ord)
34
35 mergeSortedBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
36 mergeSortedBy cmp = go
37   where
38     go [] ys = ys
39     go xs [] = xs
40     go xxs@(x:xs) yys@(y:ys) = case x `cmp` y of
41       LT -> x : go xs yys
42       EQ -> x : y : go xs ys
43       GT -> y : go xxs ys
44
45 mergeSortedsBy :: (a -> a -> Ordering) -> [[a]] -> [a]
46 mergeSortedsBy cmp = foldr (mergeSortedBy cmp) []