{-# LANGUAGE Safe #-}
module Copilot.Theorem.Misc.Utils
( isSublistOf, nub', nubBy', nubEq
, openTempFile
) where
import Data.Function (on)
import Data.List (groupBy, sortBy, group, sort)
import Control.Applicative ((<$>))
import Control.Monad
import qualified Data.Set as Set
import System.IO hiding (openTempFile)
import System.Random
import System.Directory
isSublistOf :: Ord a => [a] -> [a] -> Bool
isSublistOf :: forall a. Ord a => [a] -> [a] -> Bool
isSublistOf = forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. Ord a => [a] -> Set a
Set.fromList
nubEq :: Ord a => [a] -> [a] -> Bool
nubEq :: forall a. Ord a => [a] -> [a] -> Bool
nubEq = forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. Ord a => [a] -> Set a
Set.fromList
nub' :: Ord a => [a] -> [a]
nub' :: forall a. Ord a => [a] -> [a]
nub' = forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Eq a => [a] -> [[a]]
group forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> [a]
sort
nubBy' :: (a -> a -> Ordering) -> [a] -> [a]
nubBy' :: forall a. (a -> a -> Ordering) -> [a] -> [a]
nubBy' a -> a -> Ordering
f = forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (\a
x a
y -> a -> a -> Ordering
f a
x a
y forall a. Eq a => a -> a -> Bool
== Ordering
EQ) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy a -> a -> Ordering
f
openTempFile :: String
-> String
-> String
-> IO (String, Handle)
openTempFile :: String -> String -> String -> IO (String, Handle)
openTempFile String
loc String
baseName String
extension = do
String
path <- IO String
freshPath
Handle
handle <- String -> IOMode -> IO Handle
openFile String
path IOMode
WriteMode
forall (m :: * -> *) a. Monad m => a -> m a
return (String
path, Handle
handle)
where
freshPath :: IO FilePath
freshPath :: IO String
freshPath = do
String
path <- String -> String
pathFromSuff forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO String
randSuff
Bool
exists <- String -> IO Bool
doesFileExist String
path
if Bool
exists then IO String
freshPath else forall (m :: * -> *) a. Monad m => a -> m a
return String
path
randSuff :: IO String
randSuff :: IO String
randSuff = forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
4 forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (Random a, MonadIO m) => (a, a) -> m a
randomRIO (Char
'0', Char
'9')
pathFromSuff :: String -> FilePath
pathFromSuff :: String -> String
pathFromSuff String
suf = String
loc forall a. [a] -> [a] -> [a]
++ String
"/" forall a. [a] -> [a] -> [a]
++ String
baseName forall a. [a] -> [a] -> [a]
++ String
suf forall a. [a] -> [a] -> [a]
++ String
"." forall a. [a] -> [a] -> [a]
++ String
extension