{-# LANGUAGE CPP #-}
module Deque.Lazy.Defs
where
import Control.Monad (fail)
import Deque.Prelude hiding (tail, init, last, head, null, dropWhile, takeWhile, reverse, filter, take)
import qualified Data.List as List
import qualified Deque.Prelude as Prelude
data Deque a = Deque ![a] ![a]
fromConsAndSnocLists :: [a] -> [a] -> Deque a
fromConsAndSnocLists :: [a] -> [a] -> Deque a
fromConsAndSnocLists consList :: [a]
consList snocList :: [a]
snocList = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consList [a]
snocList
filter :: (a -> Bool) -> Deque a -> Deque a
filter :: (a -> Bool) -> Deque a -> Deque a
filter predicate :: a -> Bool
predicate (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.filter a -> Bool
predicate [a]
consList) ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.filter a -> Bool
predicate [a]
snocList)
take :: Int -> Deque a -> Deque a
take :: Int -> Deque a -> Deque a
take amount :: Int
amount (Deque consList :: [a]
consList snocList :: [a]
snocList) = let
newConsList :: [a]
newConsList = let
buildFromConsList :: Int -> [a] -> [a]
buildFromConsList amount :: Int
amount = if Int
amount Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0
then \ case
head :: a
head : tail :: [a]
tail -> a
head a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Int -> [a] -> [a]
buildFromConsList (Int -> Int
forall a. Enum a => a -> a
pred Int
amount) [a]
tail
_ -> Int -> [a] -> [a]
forall t a. (Ord t, Num t, Enum t) => t -> [a] -> [a]
buildFromSnocList Int
amount ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList)
else [a] -> [a] -> [a]
forall a b. a -> b -> a
const []
buildFromSnocList :: t -> [a] -> [a]
buildFromSnocList amount :: t
amount = if t
amount t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> 0
then \ case
head :: a
head : tail :: [a]
tail -> a
head a -> [a] -> [a]
forall a. a -> [a] -> [a]
: t -> [a] -> [a]
buildFromSnocList (t -> t
forall a. Enum a => a -> a
pred t
amount) [a]
tail
_ -> []
else [a] -> [a] -> [a]
forall a b. a -> b -> a
const []
in Int -> [a] -> [a]
buildFromConsList Int
amount [a]
consList
in [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
newConsList []
drop :: Int -> Deque a -> Deque a
drop :: Int -> Deque a -> Deque a
drop amount :: Int
amount (Deque consList :: [a]
consList snocList :: [a]
snocList) = let
buildFromConsList :: Int -> [a] -> Deque a
buildFromConsList amount :: Int
amount = if Int
amount Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0
then \ case
_ : tail :: [a]
tail -> Int -> [a] -> Deque a
buildFromConsList (Int -> Int
forall a. Enum a => a -> a
pred Int
amount) [a]
tail
_ -> Int -> [a] -> Deque a
forall t a. (Ord t, Num t, Enum t) => t -> [a] -> Deque a
buildFromSnocList Int
amount ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList)
else \ tail :: [a]
tail -> [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
tail [a]
snocList
buildFromSnocList :: t -> [a] -> Deque a
buildFromSnocList amount :: t
amount = if t
amount t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> 0
then \ case
_ : tail :: [a]
tail -> t -> [a] -> Deque a
buildFromSnocList (t -> t
forall a. Enum a => a -> a
pred t
amount) [a]
tail
_ -> [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [] []
else \ tail :: [a]
tail -> [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
tail []
in Int -> [a] -> Deque a
buildFromConsList Int
amount [a]
consList
takeWhile :: (a -> Bool) -> Deque a -> Deque a
takeWhile :: (a -> Bool) -> Deque a -> Deque a
takeWhile predicate :: a -> Bool
predicate (Deque consList :: [a]
consList snocList :: [a]
snocList) = let
newConsList :: [a]
newConsList = (a -> [a] -> [a]) -> [a] -> [a] -> [a]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
List.foldr
(\ a :: a
a nextState :: [a]
nextState -> if a -> Bool
predicate a
a
then a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
nextState
else [])
((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.takeWhile a -> Bool
predicate ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList))
[a]
consList
in [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
newConsList []
dropWhile :: (a -> Bool) -> Deque a -> Deque a
dropWhile :: (a -> Bool) -> Deque a -> Deque a
dropWhile predicate :: a -> Bool
predicate (Deque consList :: [a]
consList snocList :: [a]
snocList) = let
newConsList :: [a]
newConsList = (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhile a -> Bool
predicate [a]
consList
in case [a]
newConsList of
[] -> [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhile a -> Bool
predicate ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList)) []
_ -> [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
newConsList [a]
snocList
span :: (a -> Bool) -> Deque a -> (Deque a, Deque a)
span :: (a -> Bool) -> Deque a -> (Deque a, Deque a)
span predicate :: a -> Bool
predicate (Deque consList :: [a]
consList snocList :: [a]
snocList) = case (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.span a -> Bool
predicate [a]
consList of
(consPrefix :: [a]
consPrefix, consSuffix :: [a]
consSuffix) -> if [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
List.null [a]
consSuffix
then case (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.span a -> Bool
predicate ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList) of
(snocPrefix :: [a]
snocPrefix, snocSuffix :: [a]
snocSuffix) -> let
prefix :: Deque a
prefix = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque ([a]
consPrefix [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
<> [a]
snocPrefix) []
suffix :: Deque a
suffix = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
snocSuffix []
in (Deque a
prefix, Deque a
suffix)
else let
prefix :: Deque a
prefix = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consPrefix []
suffix :: Deque a
suffix = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consSuffix [a]
snocList
in (Deque a
prefix, Deque a
suffix)
shiftLeft :: Deque a -> Deque a
shiftLeft :: Deque a -> Deque a
shiftLeft deque :: Deque a
deque = Deque a
-> ((a, Deque a) -> Deque a) -> Maybe (a, Deque a) -> Deque a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Deque a
deque ((a -> Deque a -> Deque a) -> (a, Deque a) -> Deque a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> Deque a -> Deque a
forall a. a -> Deque a -> Deque a
snoc) (Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
uncons Deque a
deque)
shiftRight :: Deque a -> Deque a
shiftRight :: Deque a -> Deque a
shiftRight deque :: Deque a
deque = Deque a
-> ((a, Deque a) -> Deque a) -> Maybe (a, Deque a) -> Deque a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Deque a
deque ((a -> Deque a -> Deque a) -> (a, Deque a) -> Deque a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> Deque a -> Deque a
forall a. a -> Deque a -> Deque a
cons) (Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
unsnoc Deque a
deque)
cons :: a -> Deque a -> Deque a
cons :: a -> Deque a -> Deque a
cons a :: a
a (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque (a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
consList) [a]
snocList
snoc :: a -> Deque a -> Deque a
snoc :: a -> Deque a -> Deque a
snoc a :: a
a (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consList (a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
snocList)
uncons :: Deque a -> Maybe (a, Deque a)
uncons :: Deque a -> Maybe (a, Deque a)
uncons (Deque consList :: [a]
consList snocList :: [a]
snocList) = case [a]
consList of
head :: a
head : tail :: [a]
tail -> (a, Deque a) -> Maybe (a, Deque a)
forall a. a -> Maybe a
Just (a
head, [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
tail [a]
snocList)
_ -> case [a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList of
head :: a
head : tail :: [a]
tail -> (a, Deque a) -> Maybe (a, Deque a)
forall a. a -> Maybe a
Just (a
head, [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
tail [])
_ -> Maybe (a, Deque a)
forall a. Maybe a
Nothing
unsnoc :: Deque a -> Maybe (a, Deque a)
unsnoc :: Deque a -> Maybe (a, Deque a)
unsnoc (Deque consList :: [a]
consList snocList :: [a]
snocList) = case [a]
snocList of
head :: a
head : tail :: [a]
tail -> (a, Deque a) -> Maybe (a, Deque a)
forall a. a -> Maybe a
Just (a
head, [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consList [a]
tail)
_ -> case [a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
consList of
head :: a
head : tail :: [a]
tail -> (a, Deque a) -> Maybe (a, Deque a)
forall a. a -> Maybe a
Just (a
head, [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [] [a]
tail)
_ -> Maybe (a, Deque a)
forall a. Maybe a
Nothing
prepend :: Deque a -> Deque a -> Deque a
prepend :: Deque a -> Deque a -> Deque a
prepend (Deque consList1 :: [a]
consList1 snocList1 :: [a]
snocList1) (Deque consList2 :: [a]
consList2 snocList2 :: [a]
snocList2) = let
consList :: [a]
consList = [a]
consList1
snocList :: [a]
snocList = [a]
snocList2 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ ([a] -> a -> [a]) -> [a] -> [a] -> [a]
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) [a]
snocList1 [a]
consList2
in [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
consList [a]
snocList
reverse :: Deque a -> Deque a
reverse :: Deque a -> Deque a
reverse (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [a]
snocList [a]
consList
null :: Deque a -> Bool
null :: Deque a -> Bool
null (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
List.null [a]
snocList Bool -> Bool -> Bool
&& [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
List.null [a]
consList
head :: Deque a -> Maybe a
head :: Deque a -> Maybe a
head = ((a, Deque a) -> a) -> Maybe (a, Deque a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, Deque a) -> a
forall a b. (a, b) -> a
fst (Maybe (a, Deque a) -> Maybe a)
-> (Deque a -> Maybe (a, Deque a)) -> Deque a -> Maybe a
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
uncons
tail :: Deque a -> Deque a
tail :: Deque a -> Deque a
tail = Deque a -> Maybe (Deque a) -> Deque a
forall a. a -> Maybe a -> a
fromMaybe (Deque a -> Maybe (Deque a) -> Deque a)
-> (Deque a -> Deque a) -> Deque a -> Maybe (Deque a) -> Deque a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Deque a -> Deque a
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (Deque a -> Maybe (Deque a) -> Deque a)
-> (Deque a -> Maybe (Deque a)) -> Deque a -> Deque a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((a, Deque a) -> Deque a) -> Maybe (a, Deque a) -> Maybe (Deque a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, Deque a) -> Deque a
forall a b. (a, b) -> b
snd (Maybe (a, Deque a) -> Maybe (Deque a))
-> (Deque a -> Maybe (a, Deque a)) -> Deque a -> Maybe (Deque a)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
uncons
init :: Deque a -> Deque a
init :: Deque a -> Deque a
init = Deque a -> Maybe (Deque a) -> Deque a
forall a. a -> Maybe a -> a
fromMaybe (Deque a -> Maybe (Deque a) -> Deque a)
-> (Deque a -> Deque a) -> Deque a -> Maybe (Deque a) -> Deque a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Deque a -> Deque a
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (Deque a -> Maybe (Deque a) -> Deque a)
-> (Deque a -> Maybe (Deque a)) -> Deque a -> Deque a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((a, Deque a) -> Deque a) -> Maybe (a, Deque a) -> Maybe (Deque a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, Deque a) -> Deque a
forall a b. (a, b) -> b
snd (Maybe (a, Deque a) -> Maybe (Deque a))
-> (Deque a -> Maybe (a, Deque a)) -> Deque a -> Maybe (Deque a)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
unsnoc
last :: Deque a -> Maybe a
last :: Deque a -> Maybe a
last = ((a, Deque a) -> a) -> Maybe (a, Deque a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, Deque a) -> a
forall a b. (a, b) -> a
fst (Maybe (a, Deque a) -> Maybe a)
-> (Deque a -> Maybe (a, Deque a)) -> Deque a -> Maybe a
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Deque a -> Maybe (a, Deque a)
forall a. Deque a -> Maybe (a, Deque a)
unsnoc
instance Eq a => Eq (Deque a) where
== :: Deque a -> Deque a -> Bool
(==) a :: Deque a
a b :: Deque a
b = Deque a -> [Item (Deque a)]
forall l. IsList l => l -> [Item l]
toList Deque a
a [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== Deque a -> [Item (Deque a)]
forall l. IsList l => l -> [Item l]
toList Deque a
b
instance Show a => Show (Deque a) where
show :: Deque a -> String
show = [a] -> String
forall a. Show a => a -> String
show ([a] -> String) -> (Deque a -> [a]) -> Deque a -> String
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Deque a -> [a]
forall l. IsList l => l -> [Item l]
toList
instance Semigroup (Deque a) where
<> :: Deque a -> Deque a -> Deque a
(<>) = Deque a -> Deque a -> Deque a
forall a. Deque a -> Deque a -> Deque a
prepend
instance Monoid (Deque a) where
mempty :: Deque a
mempty =
[a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [] []
mappend :: Deque a -> Deque a -> Deque a
mappend =
Deque a -> Deque a -> Deque a
forall a. Semigroup a => a -> a -> a
(<>)
instance Foldable Deque where
foldr :: (a -> b -> b) -> b -> Deque a -> b
foldr step :: a -> b -> b
step init :: b
init (Deque consList :: [a]
consList snocList :: [a]
snocList) = (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> b -> b
step ((b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ((a -> b -> b) -> b -> a -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> b -> b
step) b
init [a]
snocList) [a]
consList
foldl' :: (b -> a -> b) -> b -> Deque a -> b
foldl' step :: b -> a -> b
step init :: b
init (Deque consList :: [a]
consList snocList :: [a]
snocList) = (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr' ((b -> a -> b) -> a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> a -> b
step) ((b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' b -> a -> b
step b
init [a]
consList) [a]
snocList
instance Traversable Deque where
traverse :: (a -> f b) -> Deque a -> f (Deque b)
traverse f :: a -> f b
f (Deque cs :: [a]
cs ss :: [a]
ss) =
(\cs' :: [b]
cs' ss' :: [b]
ss' -> [b] -> [b] -> Deque b
forall a. [a] -> [a] -> Deque a
Deque [b]
cs' ([b] -> [b]
forall a. [a] -> [a]
List.reverse [b]
ss')) ([b] -> [b] -> Deque b) -> f [b] -> f ([b] -> Deque b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f b) -> [a] -> f [b]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f [a]
cs f ([b] -> Deque b) -> f [b] -> f (Deque b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (a -> f b) -> [a] -> f [b]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
ss)
deriving instance Functor Deque
instance Applicative Deque where
pure :: a -> Deque a
pure a :: a
a = [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque [] [a
a]
<*> :: Deque (a -> b) -> Deque a -> Deque b
(<*>) (Deque fnConsList :: [a -> b]
fnConsList fnSnocList :: [a -> b]
fnSnocList) (Deque argConsList :: [a]
argConsList argSnocList :: [a]
argSnocList) = let
consList :: [b]
consList = let
fnStep :: (a -> b) -> [b] -> [b]
fnStep fn :: a -> b
fn resultConsList :: [b]
resultConsList = let
argStep :: a -> [b] -> [b]
argStep arg :: a
arg = (:) (a -> b
fn a
arg)
in (a -> [b] -> [b]) -> [b] -> [a] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> [b] -> [b]
argStep ((a -> [b] -> [b]) -> [b] -> [a] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> [b] -> [b]
argStep [b]
resultConsList ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
argSnocList)) [a]
argConsList
in ((a -> b) -> [b] -> [b]) -> [b] -> [a -> b] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (a -> b) -> [b] -> [b]
fnStep (((a -> b) -> [b] -> [b]) -> [b] -> [a -> b] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (a -> b) -> [b] -> [b]
fnStep [] ([a -> b] -> [a -> b]
forall a. [a] -> [a]
List.reverse [a -> b]
fnSnocList)) [a -> b]
fnConsList
in [b] -> [b] -> Deque b
forall a. [a] -> [a] -> Deque a
Deque [b]
consList []
instance Monad Deque where
return :: a -> Deque a
return = a -> Deque a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
>>= :: Deque a -> (a -> Deque b) -> Deque b
(>>=) (Deque aConsList :: [a]
aConsList aSnocList :: [a]
aSnocList) k :: a -> Deque b
k = let
consList :: [b]
consList = let
aStep :: a -> [b] -> [b]
aStep a :: a
a accBConsList :: [b]
accBConsList = case a -> Deque b
k a
a of
Deque bConsList :: [b]
bConsList bSnocList :: [b]
bSnocList -> [b]
bConsList [b] -> [b] -> [b]
forall a. Semigroup a => a -> a -> a
<> ([b] -> b -> [b]) -> [b] -> [b] -> [b]
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ((b -> [b] -> [b]) -> [b] -> b -> [b]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) [b]
accBConsList [b]
bSnocList
in (a -> [b] -> [b]) -> [b] -> [a] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> [b] -> [b]
aStep ((a -> [b] -> [b]) -> [b] -> [a] -> [b]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> [b] -> [b]
aStep [] ([a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
aSnocList)) [a]
aConsList
in [b] -> [b] -> Deque b
forall a. [a] -> [a] -> Deque a
Deque [b]
consList []
#if !(MIN_VERSION_base(4,13,0))
fail = const mempty
#endif
instance Alternative Deque where
empty :: Deque a
empty = Deque a
forall a. Monoid a => a
mempty
<|> :: Deque a -> Deque a -> Deque a
(<|>) = Deque a -> Deque a -> Deque a
forall a. Monoid a => a -> a -> a
mappend
instance MonadPlus Deque where
mzero :: Deque a
mzero = Deque a
forall (f :: * -> *) a. Alternative f => f a
empty
mplus :: Deque a -> Deque a -> Deque a
mplus = Deque a -> Deque a -> Deque a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
instance MonadFail Deque where
fail :: String -> Deque a
fail = Deque a -> String -> Deque a
forall a b. a -> b -> a
const Deque a
forall a. Monoid a => a
mempty
instance IsList (Deque a) where
type Item (Deque a) = a
fromList :: [Item (Deque a)] -> Deque a
fromList = ([a] -> [a] -> Deque a) -> [a] -> [a] -> Deque a
forall a b c. (a -> b -> c) -> b -> a -> c
flip [a] -> [a] -> Deque a
forall a. [a] -> [a] -> Deque a
Deque []
toList :: Deque a -> [Item (Deque a)]
toList (Deque consList :: [a]
consList snocList :: [a]
snocList) = [a]
consList [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
<> [a] -> [a]
forall a. [a] -> [a]
List.reverse [a]
snocList
deriving instance Generic (Deque a)
deriving instance Generic1 Deque
instance Hashable a => Hashable (Deque a)