{-# LANGUAGE ExistentialQuantification, Rank2Types #-}
module Util(
forceList,
gzip, universeParentBi,
exitMessage, exitMessageImpure,
getContentsUTF8, wildcardMatch
) where
import System.Exit
import System.IO
import System.IO.Unsafe
import Unsafe.Coerce
import Data.Data
import Data.Generics.Uniplate.DataOnly
import System.FilePattern
import Data.List.Extra
forceList :: [a] -> [a]
forceList :: forall a. [a] -> [a]
forceList [a]
xs = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs seq :: forall a b. a -> b -> b
`seq` [a]
xs
exitMessage :: String -> IO a
exitMessage :: forall a. String -> IO a
exitMessage String
msg = do
Handle -> String -> IO ()
hPutStrLn Handle
stderr String
msg
forall a. ExitCode -> IO a
exitWith forall a b. (a -> b) -> a -> b
$ Int -> ExitCode
ExitFailure Int
1
exitMessageImpure :: String -> a
exitMessageImpure :: forall a. String -> a
exitMessageImpure = forall a. IO a -> a
unsafePerformIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. String -> IO a
exitMessage
getContentsUTF8 :: IO String
getContentsUTF8 :: IO String
getContentsUTF8 = do
Handle -> TextEncoding -> IO ()
hSetEncoding Handle
stdin TextEncoding
utf8
IO String
getContents
data Box = forall a . Data a => Box a
gzip :: Data a => (forall b . Data b => b -> b -> c) -> a -> a -> Maybe [c]
gzip :: forall a c.
Data a =>
(forall b. Data b => b -> b -> c) -> a -> a -> Maybe [c]
gzip forall b. Data b => b -> b -> c
f a
x a
y | forall a. Data a => a -> Constr
toConstr a
x forall a. Eq a => a -> a -> Bool
/= forall a. Data a => a -> Constr
toConstr a
y = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Box -> Box -> c
op (forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall a. Data a => a -> Box
Box a
x) (forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall a. Data a => a -> Box
Box a
y)
where op :: Box -> Box -> c
op (Box a
x) (Box a
y) = forall b. Data b => b -> b -> c
f a
x (forall a b. a -> b
unsafeCoerce a
y)
universeParent :: Data a => a -> [(Maybe a, a)]
universeParent :: forall a. Data a => a -> [(Maybe a, a)]
universeParent a
x = (forall a. Maybe a
Nothing,a
x) forall a. a -> [a] -> [a]
: forall a. Data a => a -> [(Maybe a, a)]
f a
x
where
f :: Data a => a -> [(Maybe a, a)]
f :: forall a. Data a => a -> [(Maybe a, a)]
f a
x = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [(forall a. a -> Maybe a
Just a
x, a
y) forall a. a -> [a] -> [a]
: forall a. Data a => a -> [(Maybe a, a)]
f a
y | a
y <- forall on. Uniplate on => on -> [on]
children a
x]
universeParentBi :: (Data a, Data b) => a -> [(Maybe b, b)]
universeParentBi :: forall a b. (Data a, Data b) => a -> [(Maybe b, b)]
universeParentBi = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall a. Data a => a -> [(Maybe a, a)]
universeParent forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall from to. Biplate from to => from -> [to]
childrenBi
wildcardMatch :: FilePattern -> String -> Bool
wildcardMatch :: String -> String -> Bool
wildcardMatch String
p String
m = let f :: String -> String
f = forall a. (Partial, Eq a) => [a] -> [a] -> [a] -> [a]
replace String
"." String
"/" in String -> String
f String
p String -> String -> Bool
?== String -> String
f String
m