{-# LANGUAGE Safe, TupleSections #-}
module Dep.Utils (
toList', zipWithLast
, applyExp, applyExp'
, unionMaybeWith
, udiv
, Raster, toRaster, flatRaster, flatRaster'
, Operator
) where
import Language.Haskell.TH.Lib(appE, conE)
import Language.Haskell.TH.Syntax(Exp, Lift(lift), Name, Q)
toList' :: Foldable f
=> f a
-> [a]
-> [a]
toList' :: f a -> [a] -> [a]
toList' = ([a] -> f a -> [a]) -> f a -> [a] -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> [a] -> [a]) -> [a] -> f a -> [a]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (:))
applyExp :: Foldable f
=> Name
-> f (Q Exp)
-> Q Exp
applyExp :: Name -> f (Q Exp) -> Q Exp
applyExp = (Q Exp -> Q Exp -> Q Exp) -> Q Exp -> f (Q Exp) -> Q Exp
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Q Exp -> Q Exp -> Q Exp
appE (Q Exp -> f (Q Exp) -> Q Exp)
-> (Name -> Q Exp) -> Name -> f (Q Exp) -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Q Exp
conE
applyExp' :: (Lift a, Foldable f)
=> Name
-> f a
-> Q Exp
applyExp' :: Name -> f a -> Q Exp
applyExp' = (Q Exp -> a -> Q Exp) -> Q Exp -> f a -> Q Exp
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (((Q Exp -> Q Exp) -> (a -> Q Exp) -> a -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Q Exp
forall t. Lift t => t -> Q Exp
lift) ((Q Exp -> Q Exp) -> a -> Q Exp)
-> (Q Exp -> Q Exp -> Q Exp) -> Q Exp -> a -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Q Exp -> Q Exp -> Q Exp
appE) (Q Exp -> f a -> Q Exp) -> (Name -> Q Exp) -> Name -> f a -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Q Exp
conE
{-# NOINLINE [1] zipWithLast #-}
zipWithLast
:: (a -> a -> a)
-> [a]
-> [a]
-> [a]
zipWithLast :: (a -> a -> a) -> [a] -> [a] -> [a]
zipWithLast a -> a -> a
f = [a] -> [a] -> [a]
go
where go :: [a] -> [a] -> [a]
go [] [a]
ys = [a]
ys
go [a]
xs [] = [a]
xs
go ~(a
x:[a]
xs) ~(a
y:[a]
ys) = a -> a -> a
f a
x a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
go [a]
xs [a]
ys
unionMaybeWith
:: (a -> a -> a)
-> Maybe a
-> Maybe a
-> Maybe a
unionMaybeWith :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
unionMaybeWith a -> a -> a
f = Maybe a -> Maybe a -> Maybe a
go
where go :: Maybe a -> Maybe a -> Maybe a
go (Just a
x) (Just a
y) = a -> Maybe a
forall a. a -> Maybe a
Just (a -> a -> a
f a
x a
y)
go x :: Maybe a
x@(Just a
_) ~Maybe a
Nothing = Maybe a
x
go ~Maybe a
Nothing Maybe a
j = Maybe a
j
udiv :: Integral i
=> i
-> i
-> i
udiv :: i -> i -> i
udiv i
n i
d = i -> i -> i
forall a. Integral a => a -> a -> a
div (i
ni -> i -> i
forall a. Num a => a -> a -> a
+i
di -> i -> i
forall a. Num a => a -> a -> a
-i
1) i
d
type Raster a = [[a]]
toRaster
:: a
-> Raster b
-> Raster (a, b)
toRaster :: a -> Raster b -> Raster (a, b)
toRaster a
x = ([b] -> [(a, b)]) -> Raster b -> Raster (a, b)
forall a b. (a -> b) -> [a] -> [b]
map ((b -> (a, b)) -> [b] -> [(a, b)]
forall a b. (a -> b) -> [a] -> [b]
map (a
x, ))
flatRaster
:: (b -> Bool)
-> [(a, Raster b)]
-> Raster (a, b)
flatRaster :: (b -> Bool) -> [(a, Raster b)] -> Raster (a, b)
flatRaster b -> Bool
cond = ((a, b) -> Bool) -> [Raster (a, b)] -> Raster (a, b)
forall a. (a -> Bool) -> [Raster a] -> Raster a
flatRaster' (b -> Bool
cond (b -> Bool) -> ((a, b) -> b) -> (a, b) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, b) -> b
forall a b. (a, b) -> b
snd) ([Raster (a, b)] -> Raster (a, b))
-> ([(a, Raster b)] -> [Raster (a, b)])
-> [(a, Raster b)]
-> Raster (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, Raster b) -> Raster (a, b))
-> [(a, Raster b)] -> [Raster (a, b)]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Raster b -> Raster (a, b)) -> (a, Raster b) -> Raster (a, b)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> Raster b -> Raster (a, b)
forall a b. a -> Raster b -> Raster (a, b)
toRaster)
flatRaster'
:: (a -> Bool)
-> [Raster a]
-> Raster a
flatRaster' :: (a -> Bool) -> [Raster a] -> Raster a
flatRaster' a -> Bool
f = (Raster a -> Raster a -> Raster a)
-> Raster a -> [Raster a] -> Raster a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((a -> Bool) -> Raster a -> Raster a -> Raster a
forall a. (a -> Bool) -> Raster a -> Raster a -> Raster a
mergeRaster' a -> Bool
f) [[]]
mergeRaster'
:: (a -> Bool)
-> Raster a
-> Raster a
-> Raster a
mergeRaster' :: (a -> Bool) -> Raster a -> Raster a -> Raster a
mergeRaster' a -> Bool
p = Raster a -> Raster a -> Raster a
go
where go :: Raster a -> Raster a -> Raster a
go = ([a] -> [a] -> [a]) -> Raster a -> Raster a -> Raster a
forall a. (a -> a -> a) -> [a] -> [a] -> [a]
zipWithLast ((a -> a -> a) -> [a] -> [a] -> [a]
forall a. (a -> a -> a) -> [a] -> [a] -> [a]
zipWithLast a -> a -> a
g)
where g :: a -> a -> a
g a
x a
y
| a -> Bool
p a
x = a
x
| Bool
otherwise = a
y
type Operator a = (a, a) -> a