    -- |
    -- Definitions of lazy Deque.
    --
    -- The typical `toList` and `fromList` conversions are provided by means of
    -- the `Foldable` and `IsList` instances.
    module Deque.Lazy
      ( LazyDefs.Deque,
        fromStrict,
        toStrict,
        LazyDefs.fromConsAndSnocLists,
        LazyDefs.cons,
        LazyDefs.snoc,
        LazyDefs.reverse,
        LazyDefs.shiftLeft,
        LazyDefs.shiftRight,
        LazyDefs.filter,
        LazyDefs.take,
        LazyDefs.drop,
        LazyDefs.takeWhile,
        LazyDefs.dropWhile,
        LazyDefs.span,
        LazyDefs.uncons,
        LazyDefs.unsnoc,
        LazyDefs.null,
        LazyDefs.head,
        LazyDefs.last,
        LazyDefs.tail,
        LazyDefs.init,
      )
    where

    import qualified Deque.Lazy.Defs as LazyDefs
    import Deque.Prelude
    import qualified Deque.Strict.Defs as StrictDefs

    -- | Convert strict deque to lazy deque.
    fromStrict :: StrictDefs.Deque a -> LazyDefs.Deque a
    fromStrict :: forall a. Deque a -> Deque a
    fromStrict (StrictDefs.Deque List a
    consList List a
    snocList) = [a] -> [a] -> Deque a
    forall a. [a] -> [a] -> Deque a
    LazyDefs.Deque (List a -> [Item (List a)]
    forall l. IsList l => l -> [Item l]
    toList List a
    consList) (List a -> [Item (List a)]
    forall l. IsList l => l -> [Item l]
    toList List a
    snocList)

    -- | Convert lazy deque to strict deque.
    toStrict :: LazyDefs.Deque a -> StrictDefs.Deque a
    toStrict :: forall a. Deque a -> Deque a
    toStrict (LazyDefs.Deque [a]
    consList [a]
    snocList) = List a -> List a -> Deque a
    forall a. List a -> List a -> Deque a
    StrictDefs.Deque ([Item (List a)] -> List a
    forall l. IsList l => [Item l] -> l
    fromList [a]
    [Item (List a)]
    consList) ([Item (List a)] -> List a
    forall l. IsList l => [Item l] -> l
    fromList [a]
    [Item (List a)]
    snocList)