module Util where

import Data.List(sortBy)
import System.IO (stderr,hPutStrLn)
import System.IO.Unsafe (unsafePerformIO)

-- quick and dirty logging of debug info
_log :: String -> ()
_log    = unsafePerformIO . hPutStrLn stderr

-- strict foldl
foldl' :: (a -> b -> a) -> a -> [b] -> a
foldl' _ a []     = a
foldl' f a (x:xs) = (foldl' f $! f a x) xs

sortOn :: Ord b => (a->b) -> [a] -> [a]
sortOn f = sortBy (\x y -> compare (f x) (f y))

-- break a list into all segments at a predicate
breaks' :: (a->Bool) -> [a] -> [[a]]
breaks' _ [] = []
breaks' p xs = let (first,rest) = break' p xs in
   first : breaks' p rest

-- break a list at first occurence of predicate
break' :: (a->Bool) -> [a] -> ([a],[a])
break' p (x:xs) = if p x then let (a,b) = break p xs in (x:a,b)
		  else break p (x:xs)
break' _ [] = ([],[])