module Darcs.Patch.Witnesses.Ordered
(
(:>)(..)
, FL(..)
, RL(..)
, (:\/:)(..)
, (:/\:)(..)
, (:||:)(..)
, Fork(..)
, nullFL
, nullRL
, lengthFL
, lengthRL
, mapFL
, mapRL
, mapFL_FL
, mapRL_RL
, foldrFL
, foldlRL
, foldrwFL
, foldlwRL
, allFL
, allRL
, anyFL
, anyRL
, filterFL
, filterRL
, foldFL_M
, foldRL_M
, splitAtFL
, splitAtRL
, filterOutFLFL
, filterOutRLRL
, reverseFL
, reverseRL
, (+>+)
, (+<+)
, (+>>+)
, (+<<+)
, concatFL
, concatRL
, dropWhileFL
, dropWhileRL
, bunchFL
, spanFL
, spanFL_M
, zipWithFL
, toFL
, mapFL_FL_M
, sequenceFL_
, eqFL
, eqFLUnsafe
, initsFL
, isShorterThanRL
, snocRLSealed
, spanRL
, breakRL
, takeWhileRL
, concatRLFL
) where
import Darcs.Prelude
import Darcs.Patch.Witnesses.Show
import Darcs.Patch.Witnesses.Sealed
( FlippedSeal(..)
, flipSeal
, Sealed(..)
, FreeLeft
, unFreeLeft
, Sealed2(..)
, seal
)
import Darcs.Patch.Witnesses.Eq ( Eq2(..), EqCheck(..) )
data (a1 :> a2) wX wY = forall wZ . (a1 wX wZ) :> (a2 wZ wY)
infixr 1 :>
data FL a wX wZ where
(:>:) :: a wX wY -> FL a wY wZ -> FL a wX wZ
NilFL :: FL a wX wX
data RL a wX wZ where
(:<:) :: RL a wX wY -> a wY wZ -> RL a wX wZ
NilRL :: RL a wX wX
instance Show2 a => Show (FL a wX wZ) where
showsPrec :: Int -> FL a wX wZ -> ShowS
showsPrec Int
_ FL a wX wZ
NilFL = String -> ShowS
showString String
"NilFL"
showsPrec Int
d (a wX wY
x :>: FL a wY wZ
xs) = Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
prec) forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
prec forall a. Num a => a -> a -> a
+ Int
1) a wX wY
x forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" :>: " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
prec forall a. Num a => a -> a -> a
+ Int
1) FL a wY wZ
xs
where prec :: Int
prec = Int
5
instance Show2 a => Show1 (FL a wX)
instance Show2 a => Show2 (FL a)
instance Show2 a => Show (RL a wX wZ) where
showsPrec :: Int -> RL a wX wZ -> ShowS
showsPrec Int
_ RL a wX wZ
NilRL = String -> ShowS
showString String
"NilRL"
showsPrec Int
d (RL a wX wY
xs :<: a wY wZ
x) = Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
prec) forall a b. (a -> b) -> a -> b
$ forall a. Show a => Int -> a -> ShowS
showsPrec (Int
prec forall a. Num a => a -> a -> a
+ Int
1) RL a wX wY
xs forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" :<: " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
prec forall a. Num a => a -> a -> a
+ Int
1) a wY wZ
x
where prec :: Int
prec = Int
5
instance Show2 a => Show1 (RL a wX)
instance Show2 a => Show2 (RL a)
instance (Show2 a, Show2 b) => Show1 ((a :> b) wX)
infix 1 :/\:, :\/:, :||:
data (a1 :\/: a2) wX wY = forall wZ . (a1 wZ wX) :\/: (a2 wZ wY)
data (a3 :/\: a4) wX wY = forall wZ . (a3 wX wZ) :/\: (a4 wY wZ)
data Fork common left right wA wX wY =
forall wU. Fork (common wA wU) (left wU wX) (right wU wY)
data (a1 :||: a2) wX wY = (a1 wX wY) :||: (a2 wX wY)
instance (Show2 a, Show2 b) => Show ( (a :> b) wX wY ) where
showsPrec :: Int -> (:>) a b wX wY -> ShowS
showsPrec Int
d (a wX wZ
x :> b wZ wY
y) = forall (a :: * -> * -> *) (b :: * -> * -> *) wW wX wY wZ.
(Show2 a, Show2 b) =>
Int -> String -> Int -> a wW wX -> b wY wZ -> ShowS
showOp2 Int
1 String
":>" Int
d a wX wZ
x b wZ wY
y
instance (Eq2 a, Eq2 b) => Eq2 (a :> b) where
(a wA wZ
a1 :> b wZ wB
b1) =\/= :: forall wA wB wC. (:>) a b wA wB -> (:>) a b wA wC -> EqCheck wB wC
=\/= (a wA wZ
a2 :> b wZ wC
b2) | EqCheck wZ wZ
IsEq <- a wA wZ
a1 forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= a wA wZ
a2 = b wZ wB
b1 forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= b wZ wC
b2
| Bool
otherwise = forall wA wB. EqCheck wA wB
NotEq
instance (Eq2 a, Eq2 b) => Eq ((a :> b) wX wY) where
== :: (:>) a b wX wY -> (:>) a b wX wY -> Bool
(==) = forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare
instance (Show2 a, Show2 b) => Show2 (a :> b)
instance (Show2 a, Show2 b) => Show ( (a :\/: b) wX wY ) where
showsPrec :: Int -> (:\/:) a b wX wY -> ShowS
showsPrec Int
d (a wZ wX
x :\/: b wZ wY
y) = forall (a :: * -> * -> *) (b :: * -> * -> *) wW wX wY wZ.
(Show2 a, Show2 b) =>
Int -> String -> Int -> a wW wX -> b wY wZ -> ShowS
showOp2 Int
9 String
":\\/:" Int
d a wZ wX
x b wZ wY
y
instance (Show2 a, Show2 b) => Show2 (a :\/: b)
instance (Show2 a, Show2 b) => Show ( (a :/\: b) wX wY ) where
showsPrec :: Int -> (:/\:) a b wX wY -> ShowS
showsPrec Int
d (a wX wZ
x :/\: b wY wZ
y) = forall (a :: * -> * -> *) (b :: * -> * -> *) wW wX wY wZ.
(Show2 a, Show2 b) =>
Int -> String -> Int -> a wW wX -> b wY wZ -> ShowS
showOp2 Int
1 String
":/\\:" Int
d a wX wZ
x b wY wZ
y
instance (Show2 a, Show2 b) => Show2 ( (a :/\: b) )
infixr 5 :>:, +>+
infixl 5 :<:, +<+
nullFL :: FL a wX wZ -> Bool
nullFL :: forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Bool
nullFL FL a wX wZ
NilFL = Bool
True
nullFL FL a wX wZ
_ = Bool
False
nullRL :: RL a wX wZ -> Bool
nullRL :: forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Bool
nullRL RL a wX wZ
NilRL = Bool
True
nullRL RL a wX wZ
_ = Bool
False
filterOutFLFL :: (forall wX wY . p wX wY -> EqCheck wX wY) -> FL p wW wZ -> FL p wW wZ
filterOutFLFL :: forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> FL p wW wZ -> FL p wW wZ
filterOutFLFL forall wX wY. p wX wY -> EqCheck wX wY
_ FL p wW wZ
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
filterOutFLFL forall wX wY. p wX wY -> EqCheck wX wY
f (p wW wY
x:>:FL p wY wZ
xs) | EqCheck wW wY
IsEq <- forall wX wY. p wX wY -> EqCheck wX wY
f p wW wY
x = forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> FL p wW wZ -> FL p wW wZ
filterOutFLFL forall wX wY. p wX wY -> EqCheck wX wY
f FL p wY wZ
xs
| Bool
otherwise = p wW wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> FL p wW wZ -> FL p wW wZ
filterOutFLFL forall wX wY. p wX wY -> EqCheck wX wY
f FL p wY wZ
xs
filterOutRLRL :: (forall wX wY . p wX wY -> EqCheck wX wY) -> RL p wW wZ -> RL p wW wZ
filterOutRLRL :: forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> RL p wW wZ -> RL p wW wZ
filterOutRLRL forall wX wY. p wX wY -> EqCheck wX wY
_ RL p wW wZ
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
filterOutRLRL forall wX wY. p wX wY -> EqCheck wX wY
f (RL p wW wY
xs:<:p wY wZ
x) | EqCheck wY wZ
IsEq <- forall wX wY. p wX wY -> EqCheck wX wY
f p wY wZ
x = forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> RL p wW wZ -> RL p wW wZ
filterOutRLRL forall wX wY. p wX wY -> EqCheck wX wY
f RL p wW wY
xs
| Bool
otherwise = forall (p :: * -> * -> *) wW wZ.
(forall wX wY. p wX wY -> EqCheck wX wY)
-> RL p wW wZ -> RL p wW wZ
filterOutRLRL forall wX wY. p wX wY -> EqCheck wX wY
f RL p wW wY
xs forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<: p wY wZ
x
filterRL :: (forall wX wY . p wX wY -> Bool) -> RL p wA wB -> [Sealed2 p]
filterRL :: forall (p :: * -> * -> *) wA wB.
(forall wX wY. p wX wY -> Bool) -> RL p wA wB -> [Sealed2 p]
filterRL forall wX wY. p wX wY -> Bool
_ RL p wA wB
NilRL = []
filterRL forall wX wY. p wX wY -> Bool
f (RL p wA wY
xs :<: p wY wB
x) | forall wX wY. p wX wY -> Bool
f p wY wB
x = forall (a :: * -> * -> *) wX wY. a wX wY -> Sealed2 a
Sealed2 p wY wB
x forall a. a -> [a] -> [a]
: (forall (p :: * -> * -> *) wA wB.
(forall wX wY. p wX wY -> Bool) -> RL p wA wB -> [Sealed2 p]
filterRL forall wX wY. p wX wY -> Bool
f RL p wA wY
xs)
| Bool
otherwise = forall (p :: * -> * -> *) wA wB.
(forall wX wY. p wX wY -> Bool) -> RL p wA wB -> [Sealed2 p]
filterRL forall wX wY. p wX wY -> Bool
f RL p wA wY
xs
(+>+) :: FL a wX wY -> FL a wY wZ -> FL a wX wZ
FL a wX wY
NilFL +>+ :: forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL a wY wZ
ys = FL a wY wZ
ys
(a wX wY
x:>:FL a wY wY
xs) +>+ FL a wY wZ
ys = a wX wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL a wY wY
xs forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL a wY wZ
ys
(+<+) :: RL a wX wY -> RL a wY wZ -> RL a wX wZ
RL a wX wY
xs +<+ :: forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> RL a wY wZ -> RL a wX wZ
+<+ RL a wY wZ
NilRL = RL a wX wY
xs
RL a wX wY
xs +<+ (RL a wY wY
ys:<:a wY wZ
y) = RL a wX wY
xs forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> RL a wY wZ -> RL a wX wZ
+<+ RL a wY wY
ys forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<: a wY wZ
y
reverseFL :: FL a wX wZ -> RL a wX wZ
reverseFL :: forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL a wX wZ
xs = forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
r forall (a :: * -> * -> *) wX. RL a wX wX
NilRL FL a wX wZ
xs
where r :: RL a wL wM -> FL a wM wO -> RL a wL wO
r :: forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
r RL a wL wM
ls FL a wM wO
NilFL = RL a wL wM
ls
r RL a wL wM
ls (a wM wY
a:>:FL a wY wO
as) = forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
r (RL a wL wM
lsforall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<:a wM wY
a) FL a wY wO
as
reverseRL :: RL a wX wZ -> FL a wX wZ
reverseRL :: forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL a wX wZ
xs = forall (a :: * -> * -> *) wM wO wL.
FL a wM wO -> RL a wL wM -> FL a wL wO
r forall (a :: * -> * -> *) wX. FL a wX wX
NilFL RL a wX wZ
xs
where r :: FL a wM wO -> RL a wL wM -> FL a wL wO
r :: forall (a :: * -> * -> *) wM wO wL.
FL a wM wO -> RL a wL wM -> FL a wL wO
r FL a wM wO
ls RL a wL wM
NilRL = FL a wM wO
ls
r FL a wM wO
ls (RL a wL wY
as:<:a wY wM
a) = forall (a :: * -> * -> *) wM wO wL.
FL a wM wO -> RL a wL wM -> FL a wL wO
r (a wY wM
aforall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>:FL a wM wO
ls) RL a wL wY
as
concatFL :: FL (FL a) wX wZ -> FL a wX wZ
concatFL :: forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL FL (FL a) wX wZ
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
concatFL (FL a wX wY
a:>:FL (FL a) wY wZ
as) = FL a wX wY
a forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL FL (FL a) wY wZ
as
concatRL :: RL (RL a) wX wZ -> RL a wX wZ
concatRL :: forall (a :: * -> * -> *) wX wZ. RL (RL a) wX wZ -> RL a wX wZ
concatRL RL (RL a) wX wZ
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
concatRL (RL (RL a) wX wY
as:<:RL a wY wZ
a) = forall (a :: * -> * -> *) wX wZ. RL (RL a) wX wZ -> RL a wX wZ
concatRL RL (RL a) wX wY
as forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> RL a wY wZ -> RL a wX wZ
+<+ RL a wY wZ
a
spanFL :: (forall wW wY . a wW wY -> Bool) -> FL a wX wZ -> (FL a :> FL a) wX wZ
spanFL :: forall (a :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> Bool)
-> FL a wX wZ -> (:>) (FL a) (FL a) wX wZ
spanFL forall wW wY. a wW wY -> Bool
f (a wX wY
x:>:FL a wY wZ
xs) | forall wW wY. a wW wY -> Bool
f a wX wY
x = case forall (a :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> Bool)
-> FL a wX wZ -> (:>) (FL a) (FL a) wX wZ
spanFL forall wW wY. a wW wY -> Bool
f FL a wY wZ
xs of
FL a wY wZ
ys :> FL a wZ wZ
zs -> (a wX wY
xforall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>:FL a wY wZ
ys) forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL a wZ wZ
zs
spanFL forall wW wY. a wW wY -> Bool
_ FL a wX wZ
xs = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL a wX wZ
xs
spanFL_M :: forall a m wX wZ. Monad m =>
(forall wW wY . a wW wY -> m Bool) -> FL a wX wZ
-> m ((FL a :> FL a) wX wZ)
spanFL_M :: forall (a :: * -> * -> *) (m :: * -> *) wX wZ.
Monad m =>
(forall wW wY. a wW wY -> m Bool)
-> FL a wX wZ -> m ((:>) (FL a) (FL a) wX wZ)
spanFL_M forall wW wY. a wW wY -> m Bool
f (a wX wY
x:>:FL a wY wZ
xs) =
do
Bool
continue <- forall wW wY. a wW wY -> m Bool
f a wX wY
x
if Bool
continue
then do (FL a wY wZ
ys :> FL a wZ wZ
zs) <- forall (a :: * -> * -> *) (m :: * -> *) wX wZ.
Monad m =>
(forall wW wY. a wW wY -> m Bool)
-> FL a wX wZ -> m ((:>) (FL a) (FL a) wX wZ)
spanFL_M forall wW wY. a wW wY -> m Bool
f FL a wY wZ
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ (a wX wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL a wY wZ
ys) forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL a wZ wZ
zs
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (a wX wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL a wY wZ
xs)
spanFL_M forall wW wY. a wW wY -> m Bool
_ (FL a wX wZ
NilFL) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
splitAtFL :: Int -> FL a wX wZ -> (FL a :> FL a) wX wZ
splitAtFL :: forall (a :: * -> * -> *) wX wZ.
Int -> FL a wX wZ -> (:>) (FL a) (FL a) wX wZ
splitAtFL Int
0 FL a wX wZ
xs = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL a wX wZ
xs
splitAtFL Int
_ FL a wX wZ
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
splitAtFL Int
n (a wX wY
x:>:FL a wY wZ
xs) = case forall (a :: * -> * -> *) wX wZ.
Int -> FL a wX wZ -> (:>) (FL a) (FL a) wX wZ
splitAtFL (Int
nforall a. Num a => a -> a -> a
-Int
1) FL a wY wZ
xs of
(FL a wY wZ
xs':>FL a wZ wZ
xs'') -> (a wX wY
xforall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>:FL a wY wZ
xs' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL a wZ wZ
xs'')
splitAtRL :: Int -> RL a wX wZ -> (RL a :> RL a) wX wZ
splitAtRL :: forall (a :: * -> * -> *) wX wZ.
Int -> RL a wX wZ -> (:>) (RL a) (RL a) wX wZ
splitAtRL Int
0 RL a wX wZ
xs = RL a wX wZ
xs forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
splitAtRL Int
_ RL a wX wZ
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
splitAtRL Int
n (RL a wX wY
xs:<:a wY wZ
x) = case forall (a :: * -> * -> *) wX wZ.
Int -> RL a wX wZ -> (:>) (RL a) (RL a) wX wZ
splitAtRL (Int
nforall a. Num a => a -> a -> a
-Int
1) RL a wX wY
xs of
(RL a wX wZ
xs'':>RL a wZ wY
xs') -> (RL a wX wZ
xs''forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RL a wZ wY
xs'forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<:a wY wZ
x)
bunchFL :: Int -> FL a wX wY -> FL (FL a) wX wY
bunchFL :: forall (a :: * -> * -> *) wX wY.
Int -> FL a wX wY -> FL (FL a) wX wY
bunchFL Int
_ FL a wX wY
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
bunchFL Int
n (a wX wY
x:>:FL a wY wY
xs) = (a wX wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX wY. FL a wX wY -> FL (FL a) wX wY
bFL FL a wY wY
xs
where bFL :: FL a wX wY -> FL (FL a) wX wY
bFL :: forall (a :: * -> * -> *) wX wY. FL a wX wY -> FL (FL a) wX wY
bFL FL a wX wY
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
bFL FL a wX wY
bs = case forall (a :: * -> * -> *) wX wZ.
Int -> FL a wX wZ -> (:>) (FL a) (FL a) wX wZ
splitAtFL Int
n FL a wX wY
bs of
FL a wX wZ
a :> FL a wZ wY
b -> FL a wX wZ
a forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX wY. FL a wX wY -> FL (FL a) wX wY
bFL FL a wZ wY
b
foldFL_M :: Monad m
=> (forall wA wB. r wA -> p wA wB -> m (r wB))
-> r wX -> FL p wX wY -> m (r wY)
foldFL_M :: forall (m :: * -> *) (r :: * -> *) (p :: * -> * -> *) wX wY.
Monad m =>
(forall wA wB. r wA -> p wA wB -> m (r wB))
-> r wX -> FL p wX wY -> m (r wY)
foldFL_M forall wA wB. r wA -> p wA wB -> m (r wB)
_ r wX
r FL p wX wY
NilFL = forall (m :: * -> *) a. Monad m => a -> m a
return r wX
r
foldFL_M forall wA wB. r wA -> p wA wB -> m (r wB)
f r wX
r (p wX wY
x :>: FL p wY wY
xs) = forall wA wB. r wA -> p wA wB -> m (r wB)
f r wX
r p wX wY
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \r wY
r' -> forall (m :: * -> *) (r :: * -> *) (p :: * -> * -> *) wX wY.
Monad m =>
(forall wA wB. r wA -> p wA wB -> m (r wB))
-> r wX -> FL p wX wY -> m (r wY)
foldFL_M forall wA wB. r wA -> p wA wB -> m (r wB)
f r wY
r' FL p wY wY
xs
foldRL_M :: Monad m
=> (forall wA wB. p wA wB -> r wB -> m (r wA))
-> RL p wX wY -> r wY -> m (r wX)
foldRL_M :: forall (m :: * -> *) (p :: * -> * -> *) (r :: * -> *) wX wY.
Monad m =>
(forall wA wB. p wA wB -> r wB -> m (r wA))
-> RL p wX wY -> r wY -> m (r wX)
foldRL_M forall wA wB. p wA wB -> r wB -> m (r wA)
_ RL p wX wY
NilRL r wY
r = forall (m :: * -> *) a. Monad m => a -> m a
return r wY
r
foldRL_M forall wA wB. p wA wB -> r wB -> m (r wA)
f (RL p wX wY
xs :<: p wY wY
x) r wY
r = forall wA wB. p wA wB -> r wB -> m (r wA)
f p wY wY
x r wY
r forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) (p :: * -> * -> *) (r :: * -> *) wX wY.
Monad m =>
(forall wA wB. p wA wB -> r wB -> m (r wA))
-> RL p wX wY -> r wY -> m (r wX)
foldRL_M forall wA wB. p wA wB -> r wB -> m (r wA)
f RL p wX wY
xs
allFL :: (forall wX wY . a wX wY -> Bool) -> FL a wW wZ -> Bool
allFL :: forall (a :: * -> * -> *) wW wZ.
(forall wX wY. a wX wY -> Bool) -> FL a wW wZ -> Bool
allFL forall wX wY. a wX wY -> Bool
f FL a wW wZ
xs = forall (t :: * -> *). Foldable t => t Bool -> Bool
and forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wX wY. a wX wY -> Bool
f FL a wW wZ
xs
anyFL :: (forall wX wY . a wX wY -> Bool) -> FL a wW wZ -> Bool
anyFL :: forall (a :: * -> * -> *) wW wZ.
(forall wX wY. a wX wY -> Bool) -> FL a wW wZ -> Bool
anyFL forall wX wY. a wX wY -> Bool
f FL a wW wZ
xs = forall (t :: * -> *). Foldable t => t Bool -> Bool
or forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wX wY. a wX wY -> Bool
f FL a wW wZ
xs
allRL :: (forall wA wB . a wA wB -> Bool) -> RL a wX wY -> Bool
allRL :: forall (a :: * -> * -> *) wX wY.
(forall wA wB. a wA wB -> Bool) -> RL a wX wY -> Bool
allRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs = forall (t :: * -> *). Foldable t => t Bool -> Bool
and forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs
anyRL :: (forall wA wB . a wA wB -> Bool) -> RL a wX wY -> Bool
anyRL :: forall (a :: * -> * -> *) wX wY.
(forall wA wB. a wA wB -> Bool) -> RL a wX wY -> Bool
anyRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs = forall (t :: * -> *). Foldable t => t Bool -> Bool
or forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs
foldrFL :: (forall wA wB . p wA wB -> r -> r) -> FL p wX wY -> r -> r
foldrFL :: forall (p :: * -> * -> *) r wX wY.
(forall wA wB. p wA wB -> r -> r) -> FL p wX wY -> r -> r
foldrFL forall wA wB. p wA wB -> r -> r
_ FL p wX wY
NilFL r
r = r
r
foldrFL forall wA wB. p wA wB -> r -> r
f (p wX wY
p:>:FL p wY wY
ps) r
r = forall wA wB. p wA wB -> r -> r
f p wX wY
p (forall (p :: * -> * -> *) r wX wY.
(forall wA wB. p wA wB -> r -> r) -> FL p wX wY -> r -> r
foldrFL forall wA wB. p wA wB -> r -> r
f FL p wY wY
ps r
r)
foldlRL :: (forall wA wB . r -> p wA wB -> r) -> r -> RL p wX wY -> r
foldlRL :: forall r (p :: * -> * -> *) wX wY.
(forall wA wB. r -> p wA wB -> r) -> r -> RL p wX wY -> r
foldlRL forall wA wB. r -> p wA wB -> r
_ r
r RL p wX wY
NilRL = r
r
foldlRL forall wA wB. r -> p wA wB -> r
f r
r (RL p wX wY
ps:<:p wY wY
p) = forall wA wB. r -> p wA wB -> r
f (forall r (p :: * -> * -> *) wX wY.
(forall wA wB. r -> p wA wB -> r) -> r -> RL p wX wY -> r
foldlRL forall wA wB. r -> p wA wB -> r
f r
r RL p wX wY
ps) p wY wY
p
foldrwFL :: (forall wA wB . p wA wB -> r wB -> r wA) -> FL p wX wY -> r wY -> r wX
foldrwFL :: forall (p :: * -> * -> *) (r :: * -> *) wX wY.
(forall wA wB. p wA wB -> r wB -> r wA)
-> FL p wX wY -> r wY -> r wX
foldrwFL forall wA wB. p wA wB -> r wB -> r wA
_ FL p wX wY
NilFL r wY
r = r wY
r
foldrwFL forall wA wB. p wA wB -> r wB -> r wA
f (p wX wY
p:>:FL p wY wY
ps) r wY
r = forall wA wB. p wA wB -> r wB -> r wA
f p wX wY
p (forall (p :: * -> * -> *) (r :: * -> *) wX wY.
(forall wA wB. p wA wB -> r wB -> r wA)
-> FL p wX wY -> r wY -> r wX
foldrwFL forall wA wB. p wA wB -> r wB -> r wA
f FL p wY wY
ps r wY
r)
foldlwRL :: (forall wA wB . r wA -> p wA wB -> r wB) -> r wX -> RL p wX wY -> r wY
foldlwRL :: forall (r :: * -> *) (p :: * -> * -> *) wX wY.
(forall wA wB. r wA -> p wA wB -> r wB)
-> r wX -> RL p wX wY -> r wY
foldlwRL forall wA wB. r wA -> p wA wB -> r wB
_ r wX
r RL p wX wY
NilRL = r wX
r
foldlwRL forall wA wB. r wA -> p wA wB -> r wB
f r wX
r (RL p wX wY
ps:<:p wY wY
p) = forall wA wB. r wA -> p wA wB -> r wB
f (forall (r :: * -> *) (p :: * -> * -> *) wX wY.
(forall wA wB. r wA -> p wA wB -> r wB)
-> r wX -> RL p wX wY -> r wY
foldlwRL forall wA wB. r wA -> p wA wB -> r wB
f r wX
r RL p wX wY
ps) p wY wY
p
mapFL_FL :: (forall wW wY . a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL :: forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. a wW wY -> b wW wY
_ FL a wX wZ
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
mapFL_FL forall wW wY. a wW wY -> b wW wY
f (a wX wY
a:>:FL a wY wZ
as) = forall wW wY. a wW wY -> b wW wY
f a wX wY
a forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. a wW wY -> b wW wY
f FL a wY wZ
as
mapFL_FL_M :: Monad m => (forall wW wY . a wW wY -> m (b wW wY)) -> FL a wX wZ -> m (FL b wX wZ)
mapFL_FL_M :: forall (m :: * -> *) (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
Monad m =>
(forall wW wY. a wW wY -> m (b wW wY))
-> FL a wX wZ -> m (FL b wX wZ)
mapFL_FL_M forall wW wY. a wW wY -> m (b wW wY)
_ FL a wX wZ
NilFL = forall (m :: * -> *) a. Monad m => a -> m a
return forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
mapFL_FL_M forall wW wY. a wW wY -> m (b wW wY)
f (a wX wY
a:>:FL a wY wZ
as) = do b wX wY
b <- forall wW wY. a wW wY -> m (b wW wY)
f a wX wY
a
FL b wY wZ
bs <- forall (m :: * -> *) (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
Monad m =>
(forall wW wY. a wW wY -> m (b wW wY))
-> FL a wX wZ -> m (FL b wX wZ)
mapFL_FL_M forall wW wY. a wW wY -> m (b wW wY)
f FL a wY wZ
as
forall (m :: * -> *) a. Monad m => a -> m a
return (b wX wY
bforall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>:FL b wY wZ
bs)
sequenceFL_ :: Monad m => (forall wW wZ . a wW wZ -> m b) -> FL a wX wY -> m ()
sequenceFL_ :: forall (m :: * -> *) (a :: * -> * -> *) b wX wY.
Monad m =>
(forall wW wZ. a wW wZ -> m b) -> FL a wX wY -> m ()
sequenceFL_ forall wW wZ. a wW wZ -> m b
f = forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wW wZ. a wW wZ -> m b
f
zipWithFL :: (forall wX wY . a -> p wX wY -> q wX wY)
-> [a] -> FL p wW wZ -> FL q wW wZ
zipWithFL :: forall a (p :: * -> * -> *) (q :: * -> * -> *) wW wZ.
(forall wX wY. a -> p wX wY -> q wX wY)
-> [a] -> FL p wW wZ -> FL q wW wZ
zipWithFL forall wX wY. a -> p wX wY -> q wX wY
f (a
x:[a]
xs) (p wW wY
y :>: FL p wY wZ
ys) = forall wX wY. a -> p wX wY -> q wX wY
f a
x p wW wY
y forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: forall a (p :: * -> * -> *) (q :: * -> * -> *) wW wZ.
(forall wX wY. a -> p wX wY -> q wX wY)
-> [a] -> FL p wW wZ -> FL q wW wZ
zipWithFL forall wX wY. a -> p wX wY -> q wX wY
f [a]
xs FL p wY wZ
ys
zipWithFL forall wX wY. a -> p wX wY -> q wX wY
_ [a]
_ FL p wW wZ
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
zipWithFL forall wX wY. a -> p wX wY -> q wX wY
_ [] (p wW wY
_:>:FL p wY wZ
_) = forall a. HasCallStack => String -> a
error String
"zipWithFL called with too short a list"
mapRL_RL :: (forall wW wY . a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL :: forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall wW wY. a wW wY -> b wW wY
_ RL a wX wZ
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
mapRL_RL forall wW wY. a wW wY -> b wW wY
f (RL a wX wY
as:<:a wY wZ
a) = forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall wW wY. a wW wY -> b wW wY
f RL a wX wY
as forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<: forall wW wY. a wW wY -> b wW wY
f a wY wZ
a
{-# INLINABLE mapFL #-}
mapFL :: (forall wW wZ . a wW wZ -> b) -> FL a wX wY -> [b]
mapFL :: forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wW wZ. a wW wZ -> b
_ FL a wX wY
NilFL = []
mapFL forall wW wZ. a wW wZ -> b
f (a wX wY
a :>: FL a wY wY
b) = forall wW wZ. a wW wZ -> b
f a wX wY
a forall a. a -> [a] -> [a]
: forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wW wZ. a wW wZ -> b
f FL a wY wY
b
filterFL :: (forall wX wY . a wX wY -> Bool) -> FL a wW wZ -> [Sealed2 a]
filterFL :: forall (a :: * -> * -> *) wW wZ.
(forall wX wY. a wX wY -> Bool) -> FL a wW wZ -> [Sealed2 a]
filterFL forall wX wY. a wX wY -> Bool
_ FL a wW wZ
NilFL = []
filterFL forall wX wY. a wX wY -> Bool
f (a wW wY
a :>: FL a wY wZ
b) = if forall wX wY. a wX wY -> Bool
f a wW wY
a
then (forall (a :: * -> * -> *) wX wY. a wX wY -> Sealed2 a
Sealed2 a wW wY
a)forall a. a -> [a] -> [a]
:(forall (a :: * -> * -> *) wW wZ.
(forall wX wY. a wX wY -> Bool) -> FL a wW wZ -> [Sealed2 a]
filterFL forall wX wY. a wX wY -> Bool
f FL a wY wZ
b)
else forall (a :: * -> * -> *) wW wZ.
(forall wX wY. a wX wY -> Bool) -> FL a wW wZ -> [Sealed2 a]
filterFL forall wX wY. a wX wY -> Bool
f FL a wY wZ
b
mapRL :: (forall wW wZ . a wW wZ -> b) -> RL a wX wY -> [b]
mapRL :: forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wW wZ. a wW wZ -> b
_ RL a wX wY
NilRL = []
mapRL forall wW wZ. a wW wZ -> b
f (RL a wX wY
as :<: a wY wY
a) = forall wW wZ. a wW wZ -> b
f a wY wY
a forall a. a -> [a] -> [a]
: forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wW wZ. a wW wZ -> b
f RL a wX wY
as
lengthFL :: FL a wX wZ -> Int
lengthFL :: forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int
lengthFL FL a wX wZ
xs = forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int -> Int
l FL a wX wZ
xs Int
0
where l :: FL a wX wZ -> Int -> Int
l :: forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int -> Int
l FL a wX wZ
NilFL Int
n = Int
n
l (a wX wY
_:>:FL a wY wZ
as) Int
n = forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int -> Int
l FL a wY wZ
as forall a b. (a -> b) -> a -> b
$! Int
nforall a. Num a => a -> a -> a
+Int
1
lengthRL :: RL a wX wZ -> Int
lengthRL :: forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int
lengthRL RL a wX wZ
xs = forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int -> Int
l RL a wX wZ
xs Int
0
where l :: RL a wX wZ -> Int -> Int
l :: forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int -> Int
l RL a wX wZ
NilRL Int
n = Int
n
l (RL a wX wY
as:<:a wY wZ
_) Int
n = forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int -> Int
l RL a wX wY
as forall a b. (a -> b) -> a -> b
$! Int
nforall a. Num a => a -> a -> a
+Int
1
isShorterThanRL :: RL a wX wY -> Int -> Bool
isShorterThanRL :: forall (a :: * -> * -> *) wX wY. RL a wX wY -> Int -> Bool
isShorterThanRL RL a wX wY
_ Int
n | Int
n forall a. Ord a => a -> a -> Bool
<= Int
0 = Bool
False
isShorterThanRL RL a wX wY
NilRL Int
_ = Bool
True
isShorterThanRL (RL a wX wY
xs:<:a wY wY
_) Int
n = forall (a :: * -> * -> *) wX wY. RL a wX wY -> Int -> Bool
isShorterThanRL RL a wX wY
xs (Int
nforall a. Num a => a -> a -> a
-Int
1)
snocRLSealed :: FlippedSeal (RL a) wY -> a wY wZ -> FlippedSeal (RL a) wZ
snocRLSealed :: forall (a :: * -> * -> *) wY wZ.
FlippedSeal (RL a) wY -> a wY wZ -> FlippedSeal (RL a) wZ
snocRLSealed (FlippedSeal RL a wX wY
as) a wY wZ
a = forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
flipSeal forall a b. (a -> b) -> a -> b
$ RL a wX wY
as forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<: a wY wZ
a
toFL :: [FreeLeft a] -> Sealed (FL a wX)
toFL :: forall (a :: * -> * -> *) wX. [FreeLeft a] -> Sealed (FL a wX)
toFL [] = forall (a :: * -> *) wX. a wX -> Sealed a
Sealed forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
toFL (FreeLeft a
x:[FreeLeft a]
xs) = case forall (p :: * -> * -> *) wX. FreeLeft p -> Sealed (p wX)
unFreeLeft FreeLeft a
x of Sealed a wX wX
y -> case forall (a :: * -> * -> *) wX. [FreeLeft a] -> Sealed (FL a wX)
toFL [FreeLeft a]
xs of Sealed FL a wX wX
ys -> forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (a wX wX
y forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL a wX wX
ys)
dropWhileFL :: (forall wX wY . a wX wY -> Bool) -> FL a wR wV -> FlippedSeal (FL a) wV
dropWhileFL :: forall (a :: * -> * -> *) wR wV.
(forall wX wY. a wX wY -> Bool)
-> FL a wR wV -> FlippedSeal (FL a) wV
dropWhileFL forall wX wY. a wX wY -> Bool
_ FL a wR wV
NilFL = forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
flipSeal forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
dropWhileFL forall wX wY. a wX wY -> Bool
p xs :: FL a wR wV
xs@(a wR wY
x:>:FL a wY wV
xs')
| forall wX wY. a wX wY -> Bool
p a wR wY
x = forall (a :: * -> * -> *) wR wV.
(forall wX wY. a wX wY -> Bool)
-> FL a wR wV -> FlippedSeal (FL a) wV
dropWhileFL forall wX wY. a wX wY -> Bool
p FL a wY wV
xs'
| Bool
otherwise = forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
flipSeal FL a wR wV
xs
dropWhileRL :: (forall wX wY . a wX wY -> Bool) -> RL a wR wV -> Sealed (RL a wR)
dropWhileRL :: forall (a :: * -> * -> *) wR wV.
(forall wX wY. a wX wY -> Bool) -> RL a wR wV -> Sealed (RL a wR)
dropWhileRL forall wX wY. a wX wY -> Bool
_ RL a wR wV
NilRL = forall (a :: * -> *) wX. a wX -> Sealed a
seal forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
dropWhileRL forall wX wY. a wX wY -> Bool
p xs :: RL a wR wV
xs@(RL a wR wY
xs':<:a wY wV
x)
| forall wX wY. a wX wY -> Bool
p a wY wV
x = forall (a :: * -> * -> *) wR wV.
(forall wX wY. a wX wY -> Bool) -> RL a wR wV -> Sealed (RL a wR)
dropWhileRL forall wX wY. a wX wY -> Bool
p RL a wR wY
xs'
| Bool
otherwise = forall (a :: * -> *) wX. a wX -> Sealed a
seal RL a wR wV
xs
takeWhileRL :: (forall wA wB . a wA wB -> Bool) -> RL a wX wY -> FlippedSeal (RL a) wY
takeWhileRL :: forall (a :: * -> * -> *) wX wY.
(forall wA wB. a wA wB -> Bool)
-> RL a wX wY -> FlippedSeal (RL a) wY
takeWhileRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs = case forall (p :: * -> * -> *) wX wY.
(forall wA wB. p wA wB -> Bool)
-> RL p wX wY -> (:>) (RL p) (RL p) wX wY
spanRL forall wA wB. a wA wB -> Bool
f RL a wX wY
xs of RL a wX wZ
_ :> RL a wZ wY
r -> forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
flipSeal RL a wZ wY
r
spanRL :: (forall wA wB . p wA wB -> Bool) -> RL p wX wY -> (RL p :> RL p) wX wY
spanRL :: forall (p :: * -> * -> *) wX wY.
(forall wA wB. p wA wB -> Bool)
-> RL p wX wY -> (:>) (RL p) (RL p) wX wY
spanRL forall wA wB. p wA wB -> Bool
_ RL p wX wY
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
spanRL forall wA wB. p wA wB -> Bool
f left :: RL p wX wY
left@(RL p wX wY
ps :<: p wY wY
p)
| forall wA wB. p wA wB -> Bool
f p wY wY
p = case forall (p :: * -> * -> *) wX wY.
(forall wA wB. p wA wB -> Bool)
-> RL p wX wY -> (:>) (RL p) (RL p) wX wY
spanRL forall wA wB. p wA wB -> Bool
f RL p wX wY
ps of RL p wX wZ
left' :> RL p wZ wY
right -> RL p wX wZ
left' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RL p wZ wY
right forall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<: p wY wY
p
| Bool
otherwise = RL p wX wY
left forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
breakRL :: (forall wA wB . p wA wB -> Bool) -> RL p wX wY -> (RL p :> RL p) wX wY
breakRL :: forall (p :: * -> * -> *) wX wY.
(forall wA wB. p wA wB -> Bool)
-> RL p wX wY -> (:>) (RL p) (RL p) wX wY
breakRL forall wA wB. p wA wB -> Bool
f = forall (p :: * -> * -> *) wX wY.
(forall wA wB. p wA wB -> Bool)
-> RL p wX wY -> (:>) (RL p) (RL p) wX wY
spanRL (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall wA wB. p wA wB -> Bool
f)
eqFL :: Eq2 a => FL a wX wY -> FL a wX wZ -> EqCheck wY wZ
eqFL :: forall (a :: * -> * -> *) wX wY wZ.
Eq2 a =>
FL a wX wY -> FL a wX wZ -> EqCheck wY wZ
eqFL FL a wX wY
NilFL FL a wX wZ
NilFL = forall wA. EqCheck wA wA
IsEq
eqFL (a wX wY
x:>:FL a wY wY
xs) (a wX wY
y:>:FL a wY wZ
ys) | EqCheck wY wY
IsEq <- a wX wY
x forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= a wX wY
y, EqCheck wY wZ
IsEq <- forall (a :: * -> * -> *) wX wY wZ.
Eq2 a =>
FL a wX wY -> FL a wX wZ -> EqCheck wY wZ
eqFL FL a wY wY
xs FL a wY wZ
ys = forall wA. EqCheck wA wA
IsEq
eqFL FL a wX wY
_ FL a wX wZ
_ = forall wA wB. EqCheck wA wB
NotEq
eqFLUnsafe :: Eq2 a => FL a wX wY -> FL a wZ wW -> Bool
eqFLUnsafe :: forall (a :: * -> * -> *) wX wY wZ wW.
Eq2 a =>
FL a wX wY -> FL a wZ wW -> Bool
eqFLUnsafe FL a wX wY
NilFL FL a wZ wW
NilFL = Bool
True
eqFLUnsafe (a wX wY
x:>:FL a wY wY
xs) (a wZ wY
y:>:FL a wY wW
ys) = forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare a wX wY
x a wZ wY
y Bool -> Bool -> Bool
&& forall (a :: * -> * -> *) wX wY wZ wW.
Eq2 a =>
FL a wX wY -> FL a wZ wW -> Bool
eqFLUnsafe FL a wY wY
xs FL a wY wW
ys
eqFLUnsafe FL a wX wY
_ FL a wZ wW
_ = Bool
False
infixr 5 +>>+
infixl 5 +<<+
(+>>+) :: RL p wX wY -> FL p wY wZ -> FL p wX wZ
RL p wX wY
NilRL +>>+ :: forall (p :: * -> * -> *) wX wY wZ.
RL p wX wY -> FL p wY wZ -> FL p wX wZ
+>>+ FL p wY wZ
ys = FL p wY wZ
ys
(RL p wX wY
xs:<:p wY wY
x) +>>+ FL p wY wZ
ys = RL p wX wY
xs forall (p :: * -> * -> *) wX wY wZ.
RL p wX wY -> FL p wY wZ -> FL p wX wZ
+>>+ (p wY wY
x forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL p wY wZ
ys)
(+<<+) :: RL p wX wY -> FL p wY wZ -> RL p wX wZ
RL p wX wY
xs +<<+ :: forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
+<<+ FL p wY wZ
NilFL = RL p wX wY
xs
RL p wX wY
xs +<<+ (p wY wY
y:>:FL p wY wZ
ys) = (RL p wX wY
xsforall (a :: * -> * -> *) wX wX wZ.
RL a wX wX -> a wX wZ -> RL a wX wZ
:<:p wY wY
y) forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
+<<+ FL p wY wZ
ys
initsFL :: FL p wX wY -> [Sealed ((p :> FL p) wX)]
initsFL :: forall (p :: * -> * -> *) wX wY.
FL p wX wY -> [Sealed ((:>) p (FL p) wX)]
initsFL FL p wX wY
NilFL = []
initsFL (p wX wY
x :>: FL p wY wY
xs) =
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (p wX wY
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) forall a. a -> [a] -> [a]
:
forall a b. (a -> b) -> [a] -> [b]
map (\(Sealed (p wY wZ
y :> FL p wZ wX
xs')) -> forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (p wX wY
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wY wZ
y forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL p wZ wX
xs')) (forall (p :: * -> * -> *) wX wY.
FL p wX wY -> [Sealed ((:>) p (FL p) wX)]
initsFL FL p wY wY
xs)
concatRLFL :: RL (FL p) wX wY -> RL p wX wY
concatRLFL :: forall (p :: * -> * -> *) wX wY. RL (FL p) wX wY -> RL p wX wY
concatRLFL RL (FL p) wX wY
NilRL = forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
concatRLFL (RL (FL p) wX wY
ps :<: FL p wY wY
p) = forall (p :: * -> * -> *) wX wY. RL (FL p) wX wY -> RL p wX wY
concatRLFL RL (FL p) wX wY
ps forall (a :: * -> * -> *) wL wM wO.
RL a wL wM -> FL a wM wO -> RL a wL wO
+<<+ FL p wY wY
p