module Agda.Utils.List where
import Control.Monad (filterM)
import Data.Array (Array, array, listArray)
import qualified Data.Array as Array
import Data.Bifunctor
import Data.Function
import Data.Hashable
import qualified Data.List as List
import qualified Data.List.NonEmpty as List1
import Data.List.NonEmpty (pattern (:|), (<|))
import Data.Maybe
import qualified Data.Map as Map
import qualified Data.HashMap.Strict as HMap
import qualified Data.Set as Set
import qualified Agda.Utils.Bag as Bag
import Agda.Utils.CallStack.Base
import Agda.Utils.Function (applyWhen)
import Agda.Utils.Functor ((<.>))
import Agda.Utils.Tuple
import {-# SOURCE #-} Agda.Utils.List1 (List1)
import Agda.Utils.Impossible
snoc :: [a] -> a -> [a]
snoc :: forall a. [a] -> a -> [a]
snoc [a]
xs a
x = [a]
xs forall a. [a] -> [a] -> [a]
++ [a
x]
caseList :: [a] -> b -> (a -> [a] -> b) -> b
caseList :: forall a b. [a] -> b -> (a -> [a] -> b) -> b
caseList [a]
xs b
n a -> [a] -> b
c = forall b a. b -> (a -> [a] -> b) -> [a] -> b
listCase b
n a -> [a] -> b
c [a]
xs
caseListM :: Monad m => m [a] -> m b -> (a -> [a] -> m b) -> m b
caseListM :: forall (m :: * -> *) a b.
Monad m =>
m [a] -> m b -> (a -> [a] -> m b) -> m b
caseListM m [a]
mxs m b
n a -> [a] -> m b
c = forall b a. b -> (a -> [a] -> b) -> [a] -> b
listCase m b
n a -> [a] -> m b
c forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m [a]
mxs
listCase :: b -> (a -> [a] -> b) -> [a] -> b
listCase :: forall b a. b -> (a -> [a] -> b) -> [a] -> b
listCase b
n a -> [a] -> b
c [] = b
n
listCase b
n a -> [a] -> b
c (a
x:[a]
xs) = a -> [a] -> b
c a
x [a]
xs
headWithDefault :: a -> [a] -> a
headWithDefault :: forall a. a -> [a] -> a
headWithDefault a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
listToMaybe
tailMaybe :: [a] -> Maybe [a]
tailMaybe :: forall a. [a] -> Maybe [a]
tailMaybe = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe (a, [a])
uncons
tailWithDefault :: [a] -> [a] -> [a]
tailWithDefault :: forall a. [a] -> [a] -> [a]
tailWithDefault [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe [a]
tailMaybe
lastMaybe :: [a] -> Maybe a
lastMaybe :: forall a. [a] -> Maybe a
lastMaybe [] = forall a. Maybe a
Nothing
lastMaybe [a]
xs = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [a]
xs
lastWithDefault :: a -> [a] -> a
lastWithDefault :: forall a. a -> [a] -> a
lastWithDefault = forall a. a -> [a] -> a
last1
last1 :: a -> [a] -> a
last1 :: forall a. a -> [a] -> a
last1 a
a = \case
[] -> a
a
a
b:[a]
bs -> forall a. a -> [a] -> a
last1 a
b [a]
bs
last2 :: [a] -> Maybe (a, a)
last2 :: forall a. [a] -> Maybe (a, a)
last2 (a
x : a
y : [a]
xs) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall {t}. t -> t -> [t] -> (t, t)
loop a
x a
y [a]
xs
where
loop :: t -> t -> [t] -> (t, t)
loop t
x t
y [] = (t
x, t
y)
loop t
x t
y (t
z:[t]
xs) = t -> t -> [t] -> (t, t)
loop t
y t
z [t]
xs
last2 [a]
_ = forall a. Maybe a
Nothing
uncons :: [a] -> Maybe (a, [a])
uncons :: forall a. [a] -> Maybe (a, [a])
uncons [] = forall a. Maybe a
Nothing
uncons (a
x:[a]
xs) = forall a. a -> Maybe a
Just (a
x,[a]
xs)
mcons :: Maybe a -> [a] -> [a]
mcons :: forall a. Maybe a -> [a] -> [a]
mcons Maybe a
ma [a]
as = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [a]
as (forall a. a -> [a] -> [a]
:[a]
as) Maybe a
ma
initLast :: [a] -> Maybe ([a],a)
initLast :: forall a. [a] -> Maybe ([a], a)
initLast [] = forall a. Maybe a
Nothing
initLast (a
a:[a]
as) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> ([a], a)
initLast1 a
a [a]
as
initLast1 :: a -> [a] -> ([a], a)
initLast1 :: forall a. a -> [a] -> ([a], a)
initLast1 a
a = \case
[] -> ([], a
a)
a
b:[a]
bs -> forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (a
aforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> ([a], a)
initLast1 a
b [a]
bs
init1 :: a -> [a] -> [a]
init1 :: forall a. a -> [a] -> [a]
init1 a
a = \case
[] -> []
a
b:[a]
bs -> a
a forall a. a -> [a] -> [a]
: forall a. a -> [a] -> [a]
init1 a
b [a]
bs
initMaybe :: [a] -> Maybe [a]
initMaybe :: forall a. [a] -> Maybe [a]
initMaybe = \case
[] -> forall a. Maybe a
Nothing
a
a:[a]
as -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
init1 a
a [a]
as
initWithDefault :: [a] -> [a] -> [a]
initWithDefault :: forall a. [a] -> [a] -> [a]
initWithDefault [a]
as [] = [a]
as
initWithDefault [a]
_ (a
a:[a]
as) = forall a. a -> [a] -> [a]
init1 a
a [a]
as
(!!!) :: [a] -> Int -> Maybe a
[a]
xs !!! :: forall a. [a] -> Int -> Maybe a
!!! (!Int
i)
| Int
i forall a. Ord a => a -> a -> Bool
< Int
0 = forall a. Maybe a
Nothing
| Bool
otherwise = forall {t} {a}. (Eq t, Num t) => [a] -> t -> Maybe a
index [a]
xs Int
i
where
index :: [a] -> t -> Maybe a
index [] !t
i = forall a. Maybe a
Nothing
index (a
x : [a]
xs) t
0 = forall a. a -> Maybe a
Just a
x
index (a
x : [a]
xs) t
i = [a] -> t -> Maybe a
index [a]
xs (t
i forall a. Num a => a -> a -> a
- t
1)
(!!) :: HasCallStack => [a] -> Int -> a
[a]
xs !! :: forall a. HasCallStack => [a] -> Int -> a
!! Int
i = case [a]
xs forall a. [a] -> Int -> Maybe a
!!! Int
i of
Just a
x -> a
x
Maybe a
Nothing -> forall a. HasCallStack => a
__IMPOSSIBLE__
indexWithDefault :: a -> [a] -> Int -> a
indexWithDefault :: forall a. a -> [a] -> Int -> a
indexWithDefault a
a [] Int
_ = a
a
indexWithDefault a
a (a
x : [a]
_) Int
0 = a
x
indexWithDefault a
a (a
_ : [a]
xs) Int
n = forall a. a -> [a] -> Int -> a
indexWithDefault a
a [a]
xs (Int
n forall a. Num a => a -> a -> a
- Int
1)
findWithIndex :: (a -> Bool) -> [a] -> Maybe (a, Int)
findWithIndex :: forall a. (a -> Bool) -> [a] -> Maybe (a, Int)
findWithIndex a -> Bool
p [a]
as = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
List.find (a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) (forall a b. [a] -> [b] -> [(a, b)]
zip [a]
as [Int
0..])
genericElemIndex :: (Eq a, Integral i) => a -> [a] -> Maybe i
genericElemIndex :: forall a i. (Eq a, Integral i) => a -> [a] -> Maybe i
genericElemIndex a
x [a]
xs =
forall a. [a] -> Maybe a
listToMaybe forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$
forall a. (a -> Bool) -> [a] -> [a]
filter forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$
forall a b. [a] -> [b] -> [(a, b)]
zip [i
0..] forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (forall a. Eq a => a -> a -> Bool
== a
x) [a]
xs
downFrom :: Integral a => a -> [a]
downFrom :: forall a. Integral a => a -> [a]
downFrom a
n | a
n forall a. Ord a => a -> a -> Bool
<= a
0 = []
| Bool
otherwise = let n' :: a
n' = a
nforall a. Num a => a -> a -> a
-a
1 in a
n' forall a. a -> [a] -> [a]
: forall a. Integral a => a -> [a]
downFrom a
n'
updateHead :: (a -> a) -> [a] -> [a]
updateHead :: forall a. (a -> a) -> [a] -> [a]
updateHead a -> a
_ [] = []
updateHead a -> a
f (a
a : [a]
as) = a -> a
f a
a forall a. a -> [a] -> [a]
: [a]
as
updateLast :: (a -> a) -> [a] -> [a]
updateLast :: forall a. (a -> a) -> [a] -> [a]
updateLast a -> a
_ [] = []
updateLast a -> a
f (a
a : [a]
as) = a -> [a] -> [a]
loop a
a [a]
as
where
loop :: a -> [a] -> [a]
loop a
a [] = [a -> a
f a
a]
loop a
a (a
b : [a]
bs) = a
a forall a. a -> [a] -> [a]
: a -> [a] -> [a]
loop a
b [a]
bs
updateAt :: Int -> (a -> a) -> [a] -> [a]
updateAt :: forall a. Int -> (a -> a) -> [a] -> [a]
updateAt Int
_ a -> a
_ [] = []
updateAt Int
0 a -> a
f (a
a : [a]
as) = a -> a
f a
a forall a. a -> [a] -> [a]
: [a]
as
updateAt Int
n a -> a
f (a
a : [a]
as) = a
a forall a. a -> [a] -> [a]
: forall a. Int -> (a -> a) -> [a] -> [a]
updateAt (Int
nforall a. Num a => a -> a -> a
-Int
1) a -> a
f [a]
as
type Prefix a = [a]
type Suffix a = [a]
splitExactlyAt :: Integral n => n -> [a] -> Maybe (Prefix a, Suffix a)
splitExactlyAt :: forall n a. Integral n => n -> [a] -> Maybe ([a], [a])
splitExactlyAt n
0 [a]
xs = forall (m :: * -> *) a. Monad m => a -> m a
return ([], [a]
xs)
splitExactlyAt n
n [] = forall a. Maybe a
Nothing
splitExactlyAt n
n (a
x : [a]
xs) = forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst (a
x forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall n a. Integral n => n -> [a] -> Maybe ([a], [a])
splitExactlyAt (n
nforall a. Num a => a -> a -> a
-n
1) [a]
xs
dropEnd :: forall a. Int -> [a] -> Prefix a
dropEnd :: forall a. Int -> [a] -> [a]
dropEnd Int
n = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> (Int, [a]) -> (Int, [a])
f (Int
n, [])
where
f :: a -> (Int, [a]) -> (Int, [a])
f :: a -> (Int, [a]) -> (Int, [a])
f a
x (Int
n, [a]
xs) = (Int
nforall a. Num a => a -> a -> a
-Int
1, forall a. Bool -> (a -> a) -> a -> a
applyWhen (Int
n forall a. Ord a => a -> a -> Bool
<= Int
0) (a
xforall a. a -> [a] -> [a]
:) [a]
xs)
spanEnd :: forall a. (a -> Bool) -> [a] -> (Prefix a, Suffix a)
spanEnd :: forall a. (a -> Bool) -> [a] -> ([a], [a])
spanEnd a -> Bool
p = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> (Bool, ([a], [a])) -> (Bool, ([a], [a]))
f (Bool
True, ([], []))
where
f :: a -> (Bool, ([a], [a])) -> (Bool, ([a], [a]))
f :: a -> (Bool, ([a], [a])) -> (Bool, ([a], [a]))
f a
x (Bool
b', ([a]
xs, [a]
ys)) = (Bool
b, if Bool
b then ([a]
xs, a
xforall a. a -> [a] -> [a]
:[a]
ys) else (a
xforall a. a -> [a] -> [a]
:[a]
xs, [a]
ys))
where b :: Bool
b = Bool
b' Bool -> Bool -> Bool
&& a -> Bool
p a
x
breakAfter1 :: (a -> Bool) -> a -> [a] -> (List1 a, [a])
breakAfter1 :: forall a. (a -> Bool) -> a -> [a] -> (List1 a, [a])
breakAfter1 a -> Bool
p = a -> [a] -> (NonEmpty a, [a])
loop
where
loop :: a -> [a] -> (NonEmpty a, [a])
loop a
x = \case
xs :: [a]
xs@[] -> (a
x forall a. a -> [a] -> NonEmpty a
:| [], [a]
xs)
xs :: [a]
xs@(a
y : [a]
ys)
| a -> Bool
p a
x -> (a
x forall a. a -> [a] -> NonEmpty a
:| [], [a]
xs)
| Bool
otherwise -> let (NonEmpty a
vs, [a]
ws) = a -> [a] -> (NonEmpty a, [a])
loop a
y [a]
ys in (a
x forall a. a -> NonEmpty a -> NonEmpty a
<| NonEmpty a
vs, [a]
ws)
breakAfter :: (a -> Bool) -> [a] -> ([a], [a])
breakAfter :: forall a. (a -> Bool) -> [a] -> ([a], [a])
breakAfter a -> Bool
p = \case
[] -> ([], [])
a
x:[a]
xs -> forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first forall a. NonEmpty a -> [a]
List1.toList forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> a -> [a] -> (List1 a, [a])
breakAfter1 a -> Bool
p a
x [a]
xs
takeWhileJust :: (a -> Maybe b) -> [a] -> Prefix b
takeWhileJust :: forall a b. (a -> Maybe b) -> [a] -> Prefix b
takeWhileJust a -> Maybe b
p = [a] -> [b]
loop
where
loop :: [a] -> [b]
loop (a
a : [a]
as) | Just b
b <- a -> Maybe b
p a
a = b
b forall a. a -> [a] -> [a]
: [a] -> [b]
loop [a]
as
loop [a]
_ = []
spanJust :: (a -> Maybe b) -> [a] -> (Prefix b, Suffix a)
spanJust :: forall a b. (a -> Maybe b) -> [a] -> (Prefix b, [a])
spanJust a -> Maybe b
p = [a] -> ([b], [a])
loop
where
loop :: [a] -> ([b], [a])
loop (a
a : [a]
as) | Just b
b <- a -> Maybe b
p a
a = forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst (b
b forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ [a] -> ([b], [a])
loop [a]
as
loop [a]
as = ([], [a]
as)
partitionMaybe :: (a -> Maybe b) -> [a] -> ([a], [b])
partitionMaybe :: forall a b. (a -> Maybe b) -> [a] -> ([a], [b])
partitionMaybe a -> Maybe b
f = [a] -> ([a], [b])
loop
where
loop :: [a] -> ([a], [b])
loop [] = ([], [])
loop (a
a : [a]
as) = case a -> Maybe b
f a
a of
Maybe b
Nothing -> forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst (a
a forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ [a] -> ([a], [b])
loop [a]
as
Just b
b -> forall b d a. (b -> d) -> (a, b) -> (a, d)
mapSnd (b
b forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ [a] -> ([a], [b])
loop [a]
as
filterAndRest :: (a -> Bool) -> [a] -> ([a], Suffix a)
filterAndRest :: forall a. (a -> Bool) -> [a] -> ([a], [a])
filterAndRest a -> Bool
p = forall a b. (a -> Maybe b) -> [a] -> (Prefix b, [a])
mapMaybeAndRest forall a b. (a -> b) -> a -> b
$ \ a
a -> if a -> Bool
p a
a then forall a. a -> Maybe a
Just a
a else forall a. Maybe a
Nothing
mapMaybeAndRest :: (a -> Maybe b) -> [a] -> ([b], Suffix a)
mapMaybeAndRest :: forall a b. (a -> Maybe b) -> [a] -> (Prefix b, [a])
mapMaybeAndRest a -> Maybe b
f = [a] -> [a] -> ([b], [a])
loop [] where
loop :: [a] -> [a] -> ([b], [a])
loop [a]
acc = \case
[] -> ([], forall a. [a] -> [a]
reverse [a]
acc)
a
x:[a]
xs | Just b
y <- a -> Maybe b
f a
x -> forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (b
yforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ [a] -> [a] -> ([b], [a])
loop [] [a]
xs
| Bool
otherwise -> [a] -> [a] -> ([b], [a])
loop (a
xforall a. a -> [a] -> [a]
:[a]
acc) [a]
xs
isSublistOf :: Eq a => [a] -> [a] -> Bool
isSublistOf :: forall a. Eq a => [a] -> [a] -> Bool
isSublistOf = forall a. Eq a => [a] -> [a] -> Bool
List.isSubsequenceOf
holes :: [a] -> [(a, [a])]
holes :: forall a. [a] -> [(a, [a])]
holes [] = []
holes (a
x:[a]
xs) = (a
x, [a]
xs) forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:)) (forall a. [a] -> [(a, [a])]
holes [a]
xs)
commonPrefix :: Eq a => [a] -> [a] -> Prefix a
commonPrefix :: forall a. Eq a => [a] -> [a] -> [a]
commonPrefix [] [a]
_ = []
commonPrefix [a]
_ [] = []
commonPrefix (a
x:[a]
xs) (a
y:[a]
ys)
| a
x forall a. Eq a => a -> a -> Bool
== a
y = a
x forall a. a -> [a] -> [a]
: forall a. Eq a => [a] -> [a] -> [a]
commonPrefix [a]
xs [a]
ys
| Bool
otherwise = []
dropCommon :: [a] -> [b] -> (Suffix a, Suffix b)
dropCommon :: forall a b. [a] -> [b] -> ([a], [b])
dropCommon (a
x : [a]
xs) (b
y : [b]
ys) = forall a b. [a] -> [b] -> ([a], [b])
dropCommon [a]
xs [b]
ys
dropCommon [a]
xs [b]
ys = ([a]
xs, [b]
ys)
stripPrefixBy :: (a -> a -> Bool) -> Prefix a -> [a] -> Maybe (Suffix a)
stripPrefixBy :: forall a.
(a -> a -> Bool) -> Prefix a -> Prefix a -> Maybe (Prefix a)
stripPrefixBy a -> a -> Bool
eq = [a] -> [a] -> Maybe [a]
loop
where
loop :: [a] -> [a] -> Maybe [a]
loop [] [a]
rest = forall a. a -> Maybe a
Just [a]
rest
loop (a
_:[a]
_) [] = forall a. Maybe a
Nothing
loop (a
p:[a]
pat) (a
r:[a]
rest)
| a -> a -> Bool
eq a
p a
r = [a] -> [a] -> Maybe [a]
loop [a]
pat [a]
rest
| Bool
otherwise = forall a. Maybe a
Nothing
commonSuffix :: Eq a => [a] -> [a] -> Suffix a
commonSuffix :: forall a. Eq a => [a] -> [a] -> [a]
commonSuffix [a]
xs [a]
ys = forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ (forall a. Eq a => [a] -> [a] -> [a]
commonPrefix forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. [a] -> [a]
reverse) [a]
xs [a]
ys
stripSuffix :: Eq a => Suffix a -> [a] -> Maybe (Prefix a)
stripSuffix :: forall a. Eq a => Suffix a -> Suffix a -> Maybe (Suffix a)
stripSuffix [] = forall a. a -> Maybe a
Just
stripSuffix [a]
s = forall a. Eq a => Suffix a -> Suffix a -> Maybe (Suffix a)
stripReversedSuffix (forall a. [a] -> [a]
reverse [a]
s)
type ReversedSuffix a = [a]
stripReversedSuffix :: forall a. Eq a => ReversedSuffix a -> [a] -> Maybe (Prefix a)
stripReversedSuffix :: forall a. Eq a => Suffix a -> Suffix a -> Maybe (Suffix a)
stripReversedSuffix ReversedSuffix a
rs = StrSufSt a -> Maybe (ReversedSuffix a)
final forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> StrSufSt a -> StrSufSt a
step (forall a. ReversedSuffix a -> StrSufSt a
SSSStrip ReversedSuffix a
rs)
where
step :: a -> StrSufSt a -> StrSufSt a
step :: a -> StrSufSt a -> StrSufSt a
step a
x = \case
StrSufSt a
SSSMismatch -> forall a. StrSufSt a
SSSMismatch
SSSResult ReversedSuffix a
xs -> forall a. ReversedSuffix a -> StrSufSt a
SSSResult (a
xforall a. a -> [a] -> [a]
:ReversedSuffix a
xs)
SSSStrip [] -> forall a. ReversedSuffix a -> StrSufSt a
SSSResult [a
x]
SSSStrip (a
y:ReversedSuffix a
ys)
| a
x forall a. Eq a => a -> a -> Bool
== a
y -> forall a. ReversedSuffix a -> StrSufSt a
SSSStrip ReversedSuffix a
ys
| Bool
otherwise -> forall a. StrSufSt a
SSSMismatch
final :: StrSufSt a -> Maybe (Prefix a)
final :: StrSufSt a -> Maybe (ReversedSuffix a)
final = \case
SSSResult ReversedSuffix a
xs -> forall a. a -> Maybe a
Just ReversedSuffix a
xs
SSSStrip [] -> forall a. a -> Maybe a
Just []
StrSufSt a
_ -> forall a. Maybe a
Nothing
data StrSufSt a
= SSSMismatch
| SSSStrip (ReversedSuffix a)
| SSSResult [a]
suffixesSatisfying :: (a -> Bool) -> [a] -> [Bool]
suffixesSatisfying :: forall a. (a -> Bool) -> [a] -> [Bool]
suffixesSatisfying a -> Bool
p =
forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\a
x (Bool
b, [Bool]
bs) -> let !b' :: Bool
b' = a -> Bool
p a
x Bool -> Bool -> Bool
&& Bool
b in (Bool
b', Bool
b' forall a. a -> [a] -> [a]
: [Bool]
bs))
(Bool
True, [])
findOverlap :: forall a. Eq a => [a] -> [a] -> (Int, Int)
findOverlap :: forall a. Eq a => [a] -> [a] -> (Int, Int)
findOverlap [a]
xs [a]
ys =
forall a. a -> [a] -> a
headWithDefault forall a. HasCallStack => a
__IMPOSSIBLE__ forall a b. (a -> b) -> a -> b
$ forall a b. (a -> Maybe b) -> [a] -> Prefix b
mapMaybe (Int, [a]) -> Maybe (Int, Int)
maybePrefix forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] (forall a. [a] -> [[a]]
List.tails [a]
xs)
where
maybePrefix :: (Int, [a]) -> Maybe (Int, Int)
maybePrefix :: (Int, [a]) -> Maybe (Int, Int)
maybePrefix (Int
k, [a]
xs')
| [a]
xs' forall a. Eq a => [a] -> [a] -> Bool
`List.isPrefixOf` [a]
ys = forall a. a -> Maybe a
Just (Int
k, forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs')
| Bool
otherwise = forall a. Maybe a
Nothing
groupOn :: Ord b => (a -> b) -> [a] -> [[a]]
groupOn :: forall b a. Ord b => (a -> b) -> [a] -> [[a]]
groupOn a -> b
f = forall a. (a -> a -> Bool) -> [a] -> [[a]]
List.groupBy (forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` a -> b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Ordering) -> [a] -> [a]
List.sortBy (forall a. Ord a => a -> a -> Ordering
compare forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` a -> b
f)
groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy' :: forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy' a -> a -> Bool
_ [] = []
groupBy' a -> a -> Bool
p xxs :: [a]
xxs@(a
x : [a]
xs) = forall {a}. a -> [(Bool, a)] -> [[a]]
grp a
x forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\a
x a
y -> (a -> a -> Bool
p a
x a
y, a
y)) [a]
xxs [a]
xs
where
grp :: a -> [(Bool, a)] -> [[a]]
grp a
x [(Bool, a)]
ys = (a
x forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd [(Bool, a)]
xs) forall a. a -> [a] -> [a]
: [[a]]
tail
where ([(Bool, a)]
xs, [(Bool, a)]
rest) = forall a. (a -> Bool) -> [a] -> ([a], [a])
span forall a b. (a, b) -> a
fst [(Bool, a)]
ys
tail :: [[a]]
tail = case [(Bool, a)]
rest of
[] -> []
((Bool
_, a
z) : [(Bool, a)]
zs) -> a -> [(Bool, a)] -> [[a]]
grp a
z [(Bool, a)]
zs
chop :: Int -> [a] -> [[a]]
chop :: forall a. Int -> [a] -> [[a]]
chop Int
_ [] = []
chop Int
n [a]
xs = [a]
ys forall a. a -> [a] -> [a]
: forall a. Int -> [a] -> [[a]]
chop Int
n [a]
zs
where ([a]
ys,[a]
zs) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
xs
chopWhen :: forall a. (a -> Bool) -> [a] -> [[a]]
chopWhen :: forall a. (a -> Bool) -> [a] -> [[a]]
chopWhen a -> Bool
p [] = []
chopWhen a -> Bool
p (a
x:[a]
xs) = List1 a -> [[a]]
loop (a
x forall a. a -> [a] -> NonEmpty a
:| [a]
xs)
where
loop :: List1 a -> [[a]]
loop :: List1 a -> [[a]]
loop List1 a
xs = case forall a. (a -> Bool) -> NonEmpty a -> ([a], [a])
List1.break a -> Bool
p List1 a
xs of
([a]
w, [] ) -> [[a]
w]
([a]
w, a
_ : [] ) -> [[a]
w, []]
([a]
w, a
_ : a
y : [a]
ys) -> [a]
w forall a. a -> [a] -> [a]
: List1 a -> [[a]]
loop (a
y forall a. a -> [a] -> NonEmpty a
:| [a]
ys)
hasElem :: Ord a => [a] -> a -> Bool
hasElem :: forall a. Ord a => [a] -> a -> Bool
hasElem [a]
xs = (forall a. Ord a => a -> Set a -> Bool
`Set.member` forall a. Ord a => [a] -> Set a
Set.fromList [a]
xs)
sorted :: Ord a => [a] -> Bool
sorted :: forall a. Ord a => [a] -> Bool
sorted [] = Bool
True
sorted [a]
xs = forall (t :: * -> *). Foldable t => t Bool -> Bool
and forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Ord a => a -> a -> Bool
(<=) [a]
xs (forall a. [a] -> [a]
tail [a]
xs)
distinct :: Eq a => [a] -> Bool
distinct :: forall a. Eq a => [a] -> Bool
distinct [] = Bool
True
distinct (a
x:[a]
xs) = a
x forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [a]
xs Bool -> Bool -> Bool
&& forall a. Eq a => [a] -> Bool
distinct [a]
xs
fastDistinct :: Ord a => [a] -> Bool
fastDistinct :: forall a. Ord a => [a] -> Bool
fastDistinct [a]
xs = forall a. Set a -> Int
Set.size (forall a. Ord a => [a] -> Set a
Set.fromList [a]
xs) forall a. Eq a => a -> a -> Bool
== forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
duplicates :: Ord a => [a] -> [a]
duplicates :: forall a. Ord a => [a] -> [a]
duplicates = forall a b. (a -> Maybe b) -> [a] -> Prefix b
mapMaybe forall a. [a] -> Maybe a
dup forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Bag a -> [[a]]
Bag.groups forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> Bag a
Bag.fromList
where
dup :: [a] -> Maybe a
dup (a
a : a
_ : [a]
_) = forall a. a -> Maybe a
Just a
a
dup [a]
_ = forall a. Maybe a
Nothing
allDuplicates :: Ord a => [a] -> [a]
allDuplicates :: forall a. Ord a => [a] -> [a]
allDuplicates = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall a. Int -> [a] -> [a]
drop Int
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Bag a -> [[a]]
Bag.groups forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> Bag a
Bag.fromList
nubAndDuplicatesOn :: Ord b => (a -> b) -> [a] -> ([a], [a])
nubAndDuplicatesOn :: forall b a. Ord b => (a -> b) -> [a] -> ([a], [a])
nubAndDuplicatesOn a -> b
f = Set b -> [a] -> ([a], [a])
loop forall a. Set a
Set.empty
where
loop :: Set b -> [a] -> ([a], [a])
loop Set b
s [] = ([], [])
loop Set b
s (a
a:[a]
as)
| b
b forall a. Ord a => a -> Set a -> Bool
`Set.member` Set b
s = forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
aforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Set b -> [a] -> ([a], [a])
loop Set b
s [a]
as
| Bool
otherwise = forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (a
aforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Set b -> [a] -> ([a], [a])
loop (forall a. Ord a => a -> Set a -> Set a
Set.insert b
b Set b
s) [a]
as
where b :: b
b = a -> b
f a
a
nubOn :: Ord b => (a -> b) -> [a] -> [a]
nubOn :: forall b a. Ord b => (a -> b) -> [a] -> [a]
nubOn a -> b
f = Set b -> [a] -> [a]
loop forall a. Set a
Set.empty
where
loop :: Set b -> [a] -> [a]
loop Set b
s [] = []
loop Set b
s (a
a:[a]
as)
| b
b forall a. Ord a => a -> Set a -> Bool
`Set.member` Set b
s = Set b -> [a] -> [a]
loop Set b
s [a]
as
| Bool
otherwise = a
a forall a. a -> [a] -> [a]
: Set b -> [a] -> [a]
loop (forall a. Ord a => a -> Set a -> Set a
Set.insert b
b Set b
s) [a]
as
where b :: b
b = a -> b
f a
a
nubFavouriteOn
:: forall a b c. (Ord b, Eq c, Hashable c)
=> (a -> b)
-> (a -> c)
-> [a] -> [a]
nubFavouriteOn :: forall a b c.
(Ord b, Eq c, Hashable c) =>
(a -> b) -> (a -> c) -> [a] -> [a]
nubFavouriteOn a -> b
fav a -> c
f = Int -> HashMap c ((b, Int), a) -> [a] -> [a]
go Int
0 forall k v. HashMap k v
HMap.empty
where
go :: Int -> HMap.HashMap c ((b, Int), a) -> [a] -> [a]
go :: Int -> HashMap c ((b, Int), a) -> [a] -> [a]
go !Int
pos !HashMap c ((b, Int), a)
acc (a
x : [a]
xs) =
Int -> HashMap c ((b, Int), a) -> [a] -> [a]
go (Int
1 forall a. Num a => a -> a -> a
+ Int
pos)
(forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
HMap.insertWith
(\((b, Int), a)
new ((b, Int), a)
old -> if forall a b. (a, b) -> a
fst ((b, Int), a)
new forall a. Ord a => a -> a -> Bool
< forall a b. (a, b) -> a
fst ((b, Int), a)
old then ((b, Int), a)
new else ((b, Int), a)
old)
(a -> c
f a
x) ((a -> b
fav a
x, Int
pos), a
x) HashMap c ((b, Int), a)
acc)
[a]
xs
go Int
_ HashMap c ((b, Int), a)
acc [] =
forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Ordering) -> [a] -> [a]
List.sortBy (forall a. Ord a => a -> a -> Ordering
compare forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) forall a b. (a -> b) -> a -> b
$
forall k v. HashMap k v -> [v]
HMap.elems HashMap c ((b, Int), a)
acc
uniqOn :: Ord b => (a -> b) -> [a] -> [a]
uniqOn :: forall b a. Ord b => (a -> b) -> [a] -> [a]
uniqOn a -> b
key = forall k a. Map k a -> [a]
Map.elems forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith (\ a
_ -> forall a. a -> a
id) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (\ a
a -> (a -> b
key a
a, a
a))
allEqual :: Eq a => [a] -> Bool
allEqual :: forall a. Eq a => [a] -> Bool
allEqual [] = Bool
True
allEqual (a
x : [a]
xs) = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (forall a. Eq a => a -> a -> Bool
== a
x) [a]
xs
nubM :: Monad m => (a -> a -> m Bool) -> [a] -> m [a]
nubM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Bool) -> [a] -> m [a]
nubM a -> a -> m Bool
eq = [a] -> m [a]
loop where
loop :: [a] -> m [a]
loop [] = forall (m :: * -> *) a. Monad m => a -> m a
return []
loop (a
a:[a]
as) = (a
a forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do [a] -> m [a]
loop forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM (Bool -> Bool
not forall (m :: * -> *) b c a.
Functor m =>
(b -> c) -> (a -> m b) -> a -> m c
<.> a -> a -> m Bool
eq a
a) [a]
as
zipWith' :: (a -> b -> c) -> [a] -> [b] -> Maybe [c]
zipWith' :: forall a b c. (a -> b -> c) -> [a] -> [b] -> Maybe [c]
zipWith' a -> b -> c
f = [a] -> [b] -> Maybe [c]
loop
where
loop :: [a] -> [b] -> Maybe [c]
loop [] [] = forall a. a -> Maybe a
Just []
loop (a
x : [a]
xs) (b
y : [b]
ys) = (a -> b -> c
f a
x b
y forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [b] -> Maybe [c]
loop [a]
xs [b]
ys
loop [] (b
_ : [b]
_) = forall a. Maybe a
Nothing
loop (a
_ : [a]
_) [] = forall a. Maybe a
Nothing
zipWithKeepRest :: (a -> b -> b) -> [a] -> [b] -> [b]
zipWithKeepRest :: forall a b. (a -> b -> b) -> [a] -> [b] -> [b]
zipWithKeepRest a -> b -> b
f = [a] -> [b] -> [b]
loop
where
loop :: [a] -> [b] -> [b]
loop [] [b]
bs = [b]
bs
loop [a]
as [] = []
loop (a
a : [a]
as) (b
b : [b]
bs) = a -> b -> b
f a
a b
b forall a. a -> [a] -> [a]
: [a] -> [b] -> [b]
loop [a]
as [b]
bs
unzipWith :: (a -> (b, c)) -> [a] -> ([b], [c])
unzipWith :: forall a b c. (a -> (b, c)) -> [a] -> ([b], [c])
unzipWith a -> (b, c)
f = forall a b. [(a, b)] -> ([a], [b])
unzip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map a -> (b, c)
f
editDistanceSpec :: Eq a => [a] -> [a] -> Int
editDistanceSpec :: forall a. Eq a => [a] -> [a] -> Int
editDistanceSpec [] [a]
ys = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ys
editDistanceSpec [a]
xs [] = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
editDistanceSpec (a
x : [a]
xs) (a
y : [a]
ys)
| a
x forall a. Eq a => a -> a -> Bool
== a
y = forall a. Eq a => [a] -> [a] -> Int
editDistanceSpec [a]
xs [a]
ys
| Bool
otherwise = Int
1 forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ forall a. Eq a => [a] -> [a] -> Int
editDistanceSpec (a
x forall a. a -> [a] -> [a]
: [a]
xs) [a]
ys
, forall a. Eq a => [a] -> [a] -> Int
editDistanceSpec [a]
xs (a
y forall a. a -> [a] -> [a]
: [a]
ys)
, forall a. Eq a => [a] -> [a] -> Int
editDistanceSpec [a]
xs [a]
ys ]
editDistance :: forall a. Eq a => [a] -> [a] -> Int
editDistance :: forall a. Eq a => [a] -> [a] -> Int
editDistance [a]
xs [a]
ys = Int -> Int -> Int
editD Int
0 Int
0
where
editD :: Int -> Int -> Int
editD Int
i Int
j = Array (Int, Int) Int
tbl forall i e. Ix i => Array i e -> i -> e
Array.! (Int
i, Int
j)
tbl :: Array (Int,Int) Int
tbl :: Array (Int, Int) Int
tbl = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array ((Int
0,Int
0), (Int
n,Int
m)) [ ((Int
i, Int
j), Int -> Int -> Int
editD' Int
i Int
j) | Int
i <- [Int
0..Int
n], Int
j <- [Int
0..Int
m] ]
editD' :: Int -> Int -> Int
editD' Int
i Int
j =
case (forall a. Ord a => a -> a -> Ordering
compare Int
i Int
n, forall a. Ord a => a -> a -> Ordering
compare Int
j Int
m) of
(Ordering
LT, Ordering
LT)
| Array Int a
xsA forall i e. Ix i => Array i e -> i -> e
Array.! Int
i forall a. Eq a => a -> a -> Bool
== Array Int a
ysA forall i e. Ix i => Array i e -> i -> e
Array.! Int
j
-> Int -> Int -> Int
editD Int
i' Int
j'
| Bool
otherwise -> Int
1 forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ Int -> Int -> Int
editD Int
i' Int
j, Int -> Int -> Int
editD Int
i Int
j', Int -> Int -> Int
editD Int
i' Int
j' ]
(Ordering
EQ, Ordering
LT) -> Int
m forall a. Num a => a -> a -> a
- Int
j
(Ordering
LT, Ordering
EQ) -> Int
n forall a. Num a => a -> a -> a
- Int
i
(Ordering, Ordering)
_ -> Int
0
where (Int
i',Int
j') = (Int
iforall a. Num a => a -> a -> a
+Int
1, Int
jforall a. Num a => a -> a -> a
+Int
1)
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ys
xsA, ysA :: Array Int a
xsA :: Array Int a
xsA = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
nforall a. Num a => a -> a -> a
-Int
1) [a]
xs
ysA :: Array Int a
ysA = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
mforall a. Num a => a -> a -> a
-Int
1) [a]
ys
mergeStrictlyOrderedBy :: (a -> a -> Bool) -> [a] -> [a] -> Maybe [a]
mergeStrictlyOrderedBy :: forall a.
(a -> a -> Bool) -> Prefix a -> Prefix a -> Maybe (Prefix a)
mergeStrictlyOrderedBy a -> a -> Bool
(<) = [a] -> [a] -> Maybe [a]
loop where
loop :: [a] -> [a] -> Maybe [a]
loop [] [a]
ys = forall a. a -> Maybe a
Just [a]
ys
loop [a]
xs [] = forall a. a -> Maybe a
Just [a]
xs
loop (a
x:[a]
xs) (a
y:[a]
ys)
| a
x a -> a -> Bool
< a
y = (a
xforall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [a] -> Maybe [a]
loop [a]
xs (a
yforall a. a -> [a] -> [a]
:[a]
ys)
| a
y a -> a -> Bool
< a
x = (a
yforall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [a] -> Maybe [a]
loop (a
xforall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
| Bool
otherwise = forall a. Maybe a
Nothing