    {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, TypeFamilies #-}
    {-# OPTIONS -Wno-orphans #-}
    -- | 'Data.ListLike.ListLike' instances for 'Data.FMList.FMList'
    module Data.ListLike.FMList () where
    import Prelude hiding (cycle, map)
    import Data.ListLike.Base
    import Data.ListLike.FoldableLL
    --import Data.ListLike.IO
    import Data.ListLike.String
    import Data.FMList (FMList(..))
    import qualified Data.FMList as FM
    --import Data.Foldable (Foldable)
    import qualified Data.Foldable as F
    --import Data.Traversable (Traversable)
    --import qualified Data.Traversable as T
    import Data.String (IsString)
    import qualified Data.String as S
    import Control.Monad.Zip (MonadZip)
    import qualified Control.Monad.Zip as Z
    --import Data.Function
    import GHC.Exts (IsList(..))

    instance FoldableLL (FMList a) a where
      foldl :: forall a. (a -> a -> a) -> a -> FMList a -> a
    foldl = (a -> a -> a) -> a -> FMList a -> a
    forall b a. (b -> a -> b) -> b -> FMList a -> b
    forall (t :: * -> *) b a.
    Foldable t =>
    (b -> a -> b) -> b -> t a -> b
    F.foldl
      foldr :: forall b. (a -> b -> b) -> b -> FMList a -> b
    foldr = (a -> b -> b) -> b -> FMList a -> b
    forall a b. (a -> b -> b) -> b -> FMList a -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    F.foldr
      foldl1 :: (a -> a -> a) -> FMList a -> a
    foldl1 = (a -> a -> a) -> FMList a -> a
    forall a. (a -> a -> a) -> FMList a -> a
    forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
    F.foldl1
      foldr1 :: (a -> a -> a) -> FMList a -> a
    foldr1 = (a -> a -> a) -> FMList a -> a
    forall a. (a -> a -> a) -> FMList a -> a
    forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
    F.foldr1
      foldl' :: forall a. (a -> a -> a) -> a -> FMList a -> a
    foldl' = (a -> a -> a) -> a -> FMList a -> a
    forall b a. (b -> a -> b) -> b -> FMList a -> b
    forall (t :: * -> *) b a.
    Foldable t =>
    (b -> a -> b) -> b -> t a -> b
    F.foldl'
      foldr' :: forall b. (a -> b -> b) -> b -> FMList a -> b
    foldr' = (a -> b -> b) -> b -> FMList a -> b
    forall a b. (a -> b -> b) -> b -> FMList a -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    F.foldr'

    instance IsList (FMList a) where
      type Item (FMList a) = a
      fromList :: [Item (FMList a)] -> FMList a
    fromList = [a] -> FMList a
    [Item (FMList a)] -> FMList a
    forall a. [a] -> FMList a
    FM.fromList
      toList :: FMList a -> [Item (FMList a)]
    toList = FMList a -> [a]
    FMList a -> [Item (FMList a)]
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList

    instance ListLike (FMList a) a where
      empty :: FMList a
    empty = FMList a
    forall a. FMList a
    forall (f :: * -> *) a. Alternative f => f a
    FM.empty
      singleton :: a -> FMList a
    singleton = a -> FMList a
    forall a. a -> FMList a
    FM.singleton
      cons :: a -> FMList a -> FMList a
    cons = a -> FMList a -> FMList a
    forall a. a -> FMList a -> FMList a
    FM.cons
      snoc :: FMList a -> a -> FMList a
    snoc = FMList a -> a -> FMList a
    forall a. FMList a -> a -> FMList a
    FM.snoc
      append :: FMList a -> FMList a -> FMList a
    append = FMList a -> FMList a -> FMList a
    forall a. FMList a -> FMList a -> FMList a
    FM.append
      head :: FMList a -> a
    head = FMList a -> a
    forall a. FMList a -> a
    FM.head
      tail :: FMList a -> FMList a
    tail = FMList a -> FMList a
    forall a. FMList a -> FMList a
    FM.tail
      last :: FMList a -> a
    last = FMList a -> a
    forall a. FMList a -> a
    FM.last
      init :: FMList a -> FMList a
    init = FMList a -> FMList a
    forall a. FMList a -> FMList a
    FM.init
      --fromList = FM.fromList
      --toList = FM.toList
      null :: FMList a -> Bool
    null = FMList a -> Bool
    forall a. FMList a -> Bool
    FM.null
      genericLength :: forall a. Num a => FMList a -> a
    genericLength = FMList a -> a
    forall b a. Num b => FMList a -> b
    FM.genericLength
      length :: FMList a -> Int
    length = FMList a -> Int
    forall a. FMList a -> Int
    FM.length
      reverse :: FMList a -> FMList a
    reverse = FMList a -> FMList a
    forall a. FMList a -> FMList a
    FM.reverse
      filter :: (a -> Bool) -> FMList a -> FMList a
    filter = (a -> Bool) -> FMList a -> FMList a
    forall a. (a -> Bool) -> FMList a -> FMList a
    FM.filter
      take :: Int -> FMList a -> FMList a
    take = Int -> FMList a -> FMList a
    forall n a. (Ord n, Num n) => n -> FMList a -> FMList a
    FM.take
      takeWhile :: (a -> Bool) -> FMList a -> FMList a
    takeWhile = (a -> Bool) -> FMList a -> FMList a
    forall a. (a -> Bool) -> FMList a -> FMList a
    FM.takeWhile
      drop :: Int -> FMList a -> FMList a
    drop = Int -> FMList a -> FMList a
    forall n a. (Ord n, Num n) => n -> FMList a -> FMList a
    FM.drop
      dropWhile :: (a -> Bool) -> FMList a -> FMList a
    dropWhile = (a -> Bool) -> FMList a -> FMList a
    forall a. (a -> Bool) -> FMList a -> FMList a
    FM.dropWhile

    instance InfiniteListLike (FMList a) a where
      iterate :: (a -> a) -> a -> FMList a
    iterate = (a -> a) -> a -> FMList a
    forall a. (a -> a) -> a -> FMList a
    FM.iterate
      repeat :: a -> FMList a
    repeat = a -> FMList a
    forall a. a -> FMList a
    FM.repeat
      cycle :: FMList a -> FMList a
    cycle FMList a
    a = (FMList a
    a FMList a -> FMList a -> FMList a
    forall a. FMList a -> FMList a -> FMList a
    `FM.append` FMList a -> FMList a
    forall full item. InfiniteListLike full item => full -> full
    cycle FMList a
    a) FMList a -> FMList a -> FMList a
    forall a. FMList a -> FMList a -> FMList a
    `FM.append` FMList a
    a

    instance IsString (FMList Char) where
      fromString :: String -> FMList Char
    fromString = String -> FMList Char
    forall a. [a] -> FMList a
    FM.fromList

    instance StringLike (FMList Char) where
      toString :: FMList Char -> String
    toString = FMList Char -> String
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList
      lines :: forall full. ListLike full (FMList Char) => FMList Char -> full
    lines = (String -> FMList Char) -> [String] -> full
    forall full' item'.
    ListLike full' item' =>
    (String -> item') -> [String] -> full'
    forall full item full' item'.
    (ListLike full item, ListLike full' item') =>
    (item -> item') -> full -> full'
    map String -> FMList Char
    forall a. [a] -> FMList a
    FM.fromList ([String] -> full)
    -> (FMList Char -> [String]) -> FMList Char -> full
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> [String]
    S.lines (String -> [String])
    -> (FMList Char -> String) -> FMList Char -> [String]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . FMList Char -> String
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList
      words :: forall full. ListLike full (FMList Char) => FMList Char -> full
    words = (String -> FMList Char) -> [String] -> full
    forall full' item'.
    ListLike full' item' =>
    (String -> item') -> [String] -> full'
    forall full item full' item'.
    (ListLike full item, ListLike full' item') =>
    (item -> item') -> full -> full'
    map String -> FMList Char
    forall a. [a] -> FMList a
    FM.fromList ([String] -> full)
    -> (FMList Char -> [String]) -> FMList Char -> full
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> [String]
    S.words (String -> [String])
    -> (FMList Char -> String) -> FMList Char -> [String]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . FMList Char -> String
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList
      unlines :: forall full. ListLike full (FMList Char) => full -> FMList Char
    unlines = String -> FMList Char
    forall a. [a] -> FMList a
    FM.fromList (String -> FMList Char) -> (full -> String) -> full -> FMList Char
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . [String] -> String
    S.unlines ([String] -> String) -> (full -> [String]) -> full -> String
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (FMList Char -> String) -> full -> [String]
    forall full' item'.
    ListLike full' item' =>
    (FMList Char -> item') -> full -> full'
    forall full item full' item'.
    (ListLike full item, ListLike full' item') =>
    (item -> item') -> full -> full'
    map FMList Char -> String
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList
      unwords :: forall full. ListLike full (FMList Char) => full -> FMList Char
    unwords = String -> FMList Char
    forall a. [a] -> FMList a
    FM.fromList (String -> FMList Char) -> (full -> String) -> full -> FMList Char
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . [String] -> String
    S.unwords ([String] -> String) -> (full -> [String]) -> full -> String
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (FMList Char -> String) -> full -> [String]
    forall full' item'.
    ListLike full' item' =>
    (FMList Char -> item') -> full -> full'
    forall full item full' item'.
    (ListLike full item, ListLike full' item') =>
    (item -> item') -> full -> full'
    map FMList Char -> String
    forall a. FMList a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    FM.toList

    instance MonadZip FMList where
      mzipWith :: forall a b c. (a -> b -> c) -> FMList a -> FMList b -> FMList c
    mzipWith = (a -> b -> c) -> FMList a -> FMList b -> FMList c
    forall a b c. (a -> b -> c) -> FMList a -> FMList b -> FMList c
    FM.zipWith