1{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, TypeFamilies #-}
2{-# OPTIONS -fno-warn-orphans #-}
3-- | 'Data.ListLike.ListLike' instances for 'Data.FMList.FMList'
4module Data.ListLike.FMList () where
5import Prelude hiding (cycle, map)
6import Data.ListLike.Base
7import Data.ListLike.FoldableLL
8--import Data.ListLike.IO
9import Data.ListLike.String
10import Data.FMList (FMList(..))
11import qualified Data.FMList as FM
12--import Data.Foldable (Foldable)
13import qualified Data.Foldable as F
14--import Data.Traversable (Traversable)
15--import qualified Data.Traversable as T
16import Data.String (IsString)
17import qualified Data.String as S
18import Control.Monad.Zip (MonadZip)
19import qualified Control.Monad.Zip as Z
20--import Data.Function
21import Data.Char (Char)
22import GHC.Exts (IsList(..))
23
24instance FoldableLL (FMList a) a where
25  foldl = F.foldl
26  foldr = F.foldr
27  foldl1 = F.foldl1
28  foldr1 = F.foldr1
29  foldl' = F.foldl'
30  foldr' = F.foldr'
31
32instance IsList (FMList a) where
33  type Item (FMList a) = a
34  fromList = FM.fromList
35  toList = FM.toList
36
37instance ListLike (FMList a) a where
38  empty = FM.empty
39  singleton = FM.singleton
40  cons = FM.cons
41  snoc = FM.snoc
42  append = FM.append
43  head = FM.head
44  tail = FM.tail
45  last = FM.last
46  init = FM.init
47  --fromList = FM.fromList
48  --toList = FM.toList
49  null = FM.null
50  genericLength = FM.genericLength
51  length = FM.length
52  reverse = FM.reverse
53  filter = FM.filter
54  take = FM.take
55  takeWhile = FM.takeWhile
56  drop = FM.drop
57  dropWhile = FM.dropWhile
58
59instance InfiniteListLike (FMList a) a where
60  iterate = FM.iterate
61  repeat = FM.repeat
62  cycle a = (a `FM.append` cycle a) `FM.append` a
63
64instance IsString (FMList Char) where
65  fromString = FM.fromList
66
67instance StringLike (FMList Char) where
68  toString = FM.toList
69  lines = map FM.fromList . S.lines . FM.toList
70  words = map FM.fromList . S.words . FM.toList
71  unlines = FM.fromList . S.unlines . map FM.toList
72  unwords = FM.fromList . S.unwords . map FM.toList
73
74instance MonadZip FMList where
75  mzipWith = FM.zipWith
76