module Index where
import Prelude hiding (Word)
import Chapter11 ((>.>))
import qualified Chapter7
type Doc = String
type Line = String
type Word = String
makeIndex :: Doc -> [ ([Int],Word) ]
makeIndex :: Word -> [([Int], Word)]
makeIndex
= Word -> [Word]
lines (Word -> [Word])
-> ([Word] -> [(Int, Word)]) -> Word -> [(Int, Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[Word] -> [(Int, Word)]
numLines (Word -> [(Int, Word)])
-> ([(Int, Word)] -> [(Int, Word)]) -> Word -> [(Int, Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[(Int, Word)] -> [(Int, Word)]
allNumWords (Word -> [(Int, Word)])
-> ([(Int, Word)] -> [(Int, Word)]) -> Word -> [(Int, Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[(Int, Word)] -> [(Int, Word)]
sortLs (Word -> [(Int, Word)])
-> ([(Int, Word)] -> [([Int], Word)]) -> Word -> [([Int], Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[(Int, Word)] -> [([Int], Word)]
makeLists (Word -> [([Int], Word)])
-> ([([Int], Word)] -> [([Int], Word)]) -> Word -> [([Int], Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[([Int], Word)] -> [([Int], Word)]
amalgamate (Word -> [([Int], Word)])
-> ([([Int], Word)] -> [([Int], Word)]) -> Word -> [([Int], Word)]
forall a b c. (a -> b) -> (b -> c) -> a -> c
>.>
[([Int], Word)] -> [([Int], Word)]
shorten
numLines :: [Line] -> [ ( Int , Line ) ]
numLines :: [Word] -> [(Int, Word)]
numLines [Word]
linels
= [Int] -> [Word] -> [(Int, Word)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 .. [Word] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Word]
linels] [Word]
linels
numWords :: ( Int , Line ) -> [ ( Int , Word ) ]
numWords :: (Int, Word) -> [(Int, Word)]
numWords (Int
number , Word
line)
= [ (Int
number , Word
word) | Word
word <- Word -> [Word]
Chapter7.splitWords Word
line ]
whitespace :: String
whitespace :: Word
whitespace = Word
" \n\t;:.,\'\"!?()-"
allNumWords :: [ ( Int , Line ) ] -> [ ( Int , Word ) ]
allNumWords :: [(Int, Word)] -> [(Int, Word)]
allNumWords = [[(Int, Word)]] -> [(Int, Word)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(Int, Word)]] -> [(Int, Word)])
-> ([(Int, Word)] -> [[(Int, Word)]])
-> [(Int, Word)]
-> [(Int, Word)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Word) -> [(Int, Word)]) -> [(Int, Word)] -> [[(Int, Word)]]
forall a b. (a -> b) -> [a] -> [b]
map (Int, Word) -> [(Int, Word)]
numWords
orderPair :: ( Int , Word ) -> ( Int , Word ) -> Bool
orderPair :: (Int, Word) -> (Int, Word) -> Bool
orderPair ( Int
n1 , Word
w1 ) ( Int
n2 , Word
w2 )
= Word
w1 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
w2 Bool -> Bool -> Bool
|| ( Word
w1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
w2 Bool -> Bool -> Bool
&& Int
n1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n2 )
sortLs :: [ ( Int , Word ) ] -> [ ( Int , Word ) ]
sortLs :: [(Int, Word)] -> [(Int, Word)]
sortLs [] = []
sortLs ((Int, Word)
p:[(Int, Word)]
ps)
= [(Int, Word)] -> [(Int, Word)]
sortLs [(Int, Word)]
smaller [(Int, Word)] -> [(Int, Word)] -> [(Int, Word)]
forall a. [a] -> [a] -> [a]
++ [(Int, Word)
p] [(Int, Word)] -> [(Int, Word)] -> [(Int, Word)]
forall a. [a] -> [a] -> [a]
++ [(Int, Word)] -> [(Int, Word)]
sortLs [(Int, Word)]
larger
where
smaller :: [(Int, Word)]
smaller = [ (Int, Word)
q | (Int, Word)
q<-[(Int, Word)]
ps , (Int, Word) -> (Int, Word) -> Bool
orderPair (Int, Word)
q (Int, Word)
p ]
larger :: [(Int, Word)]
larger = [ (Int, Word)
q | (Int, Word)
q<-[(Int, Word)]
ps , (Int, Word) -> (Int, Word) -> Bool
orderPair (Int, Word)
p (Int, Word)
q ]
makeLists :: [ (Int,Word) ] -> [ ([Int],Word) ]
makeLists :: [(Int, Word)] -> [([Int], Word)]
makeLists
= ((Int, Word) -> ([Int], Word)) -> [(Int, Word)] -> [([Int], Word)]
forall a b. (a -> b) -> [a] -> [b]
map (Int, Word) -> ([Int], Word)
forall {a} {b}. (a, b) -> ([a], b)
mklis
where
mklis :: (a, b) -> ([a], b)
mklis ( a
n , b
st ) = ( [a
n] , b
st )
amalgamate :: [ ([Int],Word) ] -> [ ([Int],Word) ]
amalgamate :: [([Int], Word)] -> [([Int], Word)]
amalgamate [] = []
amalgamate [([Int], Word)
p] = [([Int], Word)
p]
amalgamate (([Int]
l1,Word
w1):([Int]
l2,Word
w2):[([Int], Word)]
rest)
| Word
w1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
/= Word
w2 = ([Int]
l1,Word
w1) ([Int], Word) -> [([Int], Word)] -> [([Int], Word)]
forall a. a -> [a] -> [a]
: [([Int], Word)] -> [([Int], Word)]
amalgamate (([Int]
l2,Word
w2)([Int], Word) -> [([Int], Word)] -> [([Int], Word)]
forall a. a -> [a] -> [a]
:[([Int], Word)]
rest)
| Bool
otherwise = [([Int], Word)] -> [([Int], Word)]
amalgamate (([Int]
l1[Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++[Int]
l2,Word
w1)([Int], Word) -> [([Int], Word)] -> [([Int], Word)]
forall a. a -> [a] -> [a]
:[([Int], Word)]
rest)
shorten :: [([Int],Word)] -> [([Int],Word)]
shorten :: [([Int], Word)] -> [([Int], Word)]
shorten
= (([Int], Word) -> Bool) -> [([Int], Word)] -> [([Int], Word)]
forall a. (a -> Bool) -> [a] -> [a]
filter ([Int], Word) -> Bool
forall {t :: * -> *} {a} {a}. Foldable t => (a, t a) -> Bool
sizer
where
sizer :: (a, t a) -> Bool
sizer (a
nl,t a
wd) = t a -> Int
forall a. t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
wd Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
3