module Data.List.Predicate
(
allEqual
, allEqualBy
, sorted
, sortedBy
, allUnique
, allUniqueBy
, allAdjUnique
, allAdjUniqueBy
, ascSequential
, descSequential
, palindrome
) where
import Data.List (sort, sortBy)
allEqual :: (Eq a) => [a] -> Bool
allEqual :: [a] -> Bool
allEqual = (a -> a -> Bool) -> [a] -> Bool
forall a. (a -> a -> Bool) -> [a] -> Bool
allEqualBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
allEqualBy :: (a -> a -> Bool) -> [a] -> Bool
allEqualBy :: (a -> a -> Bool) -> [a] -> Bool
allEqualBy _ [] = Bool
True
allEqualBy eq :: a -> a -> Bool
eq (x :: a
x : xs :: [a]
xs) = (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (a -> a -> Bool
eq a
x) [a]
xs
sorted :: (Ord a) => [a] -> Bool
sorted :: [a] -> Bool
sorted = (a -> a -> Ordering) -> [a] -> Bool
forall a. (a -> a -> Ordering) -> [a] -> Bool
sortedBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
sortedBy :: (a -> a -> Ordering) -> [a] -> Bool
sortedBy :: (a -> a -> Ordering) -> [a] -> Bool
sortedBy _ [] = Bool
True
sortedBy _ [_] = Bool
True
sortedBy cmp :: a -> a -> Ordering
cmp xs :: [a]
xs = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (a -> a -> Bool) -> [a] -> [a] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\a :: a
a b :: a
b -> a -> a -> Ordering
cmp a
a a
b Ordering -> Ordering -> Bool
forall a. Ord a => a -> a -> Bool
<= Ordering
EQ) [a]
xs ([a] -> [a]
forall a. [a] -> [a]
tail [a]
xs)
allUnique :: (Ord a) => [a] -> Bool
allUnique :: [a] -> Bool
allUnique = [a] -> Bool
forall a. Eq a => [a] -> Bool
allAdjUnique ([a] -> Bool) -> ([a] -> [a]) -> [a] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Ord a => [a] -> [a]
sort
allUniqueBy :: (a -> a -> Ordering) -> [a] -> Bool
allUniqueBy :: (a -> a -> Ordering) -> [a] -> Bool
allUniqueBy cmp :: a -> a -> Ordering
cmp = (a -> a -> Bool) -> [a] -> Bool
forall a. (a -> a -> Bool) -> [a] -> Bool
allAdjUniqueBy a -> a -> Bool
eq ([a] -> Bool) -> ([a] -> [a]) -> [a] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy a -> a -> Ordering
cmp
where
eq :: a -> a -> Bool
eq a :: a
a b :: a
b = a -> a -> Ordering
cmp a
a a
b Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ
allAdjUnique :: (Eq a) => [a] -> Bool
allAdjUnique :: [a] -> Bool
allAdjUnique = (a -> a -> Bool) -> [a] -> Bool
forall a. (a -> a -> Bool) -> [a] -> Bool
allAdjUniqueBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
allAdjUniqueBy :: (a -> a -> Bool) -> [a] -> Bool
allAdjUniqueBy :: (a -> a -> Bool) -> [a] -> Bool
allAdjUniqueBy eq :: a -> a -> Bool
eq xs :: [a]
xs = (Bool -> Bool
not (Bool -> Bool) -> ([Bool] -> Bool) -> [Bool] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or) ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (a -> a -> Bool) -> [a] -> [a] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> Bool
eq [a]
xs ([a] -> [a]
forall a. [a] -> [a]
tail [a]
xs)
ascSequential :: (Enum a) => [a] -> Bool
ascSequential :: [a] -> Bool
ascSequential [] = Bool
True
ascSequential [_] = Bool
True
ascSequential xs :: [a]
xs = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool) -> [Int] -> [Int] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) [Int]
xs' [[Int] -> Int
forall a. [a] -> a
head [Int]
xs' ..]
where
xs' :: [Int]
xs' = (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map a -> Int
forall a. Enum a => a -> Int
fromEnum [a]
xs
descSequential :: (Enum a) => [a] -> Bool
descSequential :: [a] -> Bool
descSequential [] = Bool
True
descSequential [_] = Bool
True
descSequential xs :: [a]
xs = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Bool) -> [Int] -> [Int] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) [Int]
xs' [Int
x, Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1 ..]
where
xs' :: [Int]
xs' = (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map a -> Int
forall a. Enum a => a -> Int
fromEnum [a]
xs
x :: Int
x = [Int] -> Int
forall a. [a] -> a
head [Int]
xs'
palindrome :: (Eq a) => [a] -> Bool
palindrome :: [a] -> Bool
palindrome xs :: [a]
xs = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> [Bool] -> [Bool]
forall a. Int -> [a] -> [a]
take (Int
len Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` 2) ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall a b. (a -> b) -> a -> b
$ (a -> a -> Bool) -> [a] -> [a] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==) [a]
xs [a]
rev
where
(rev :: [a]
rev, len :: Int
len) = [a] -> ([a], Int)
forall a. [a] -> ([a], Int)
reverseLength [a]
xs
reverseLength :: [a] -> ([a], Int)
reverseLength :: [a] -> ([a], Int)
reverseLength = [a] -> Int -> [a] -> ([a], Int)
forall a. [a] -> Int -> [a] -> ([a], Int)
reverseLengthWith [] 0
where
reverseLengthWith :: [a] -> Int -> [a] -> ([a], Int)
reverseLengthWith :: [a] -> Int -> [a] -> ([a], Int)
reverseLengthWith ys :: [a]
ys n :: Int
n [] = ([a]
ys, Int
n)
reverseLengthWith ys :: [a]
ys n :: Int
n (x :: a
x : xs :: [a]
xs) =
let n' :: Int
n' = Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1
in Int -> ([a], Int) -> ([a], Int)
forall a b. a -> b -> b
seq Int
n' ([a] -> Int -> [a] -> ([a], Int)
forall a. [a] -> Int -> [a] -> ([a], Int)
reverseLengthWith (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys) Int
n' [a]
xs)