@@ -0,0 +1,101 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE TypeOperators #-}
7+import Control.Applicative
8+import Control.Monad.IO.Class
13+import qualified Language.Javascript.JQuery as JQ
26+randomPoint :: MonadIO m => m Point
27+randomPoint = liftIO . mwc $ Point <$> d <*> d
29+ where d = doubleIn (-1, 1)
31+data Search a = Search
36+mkSearch :: String -> [a] -> Search a
39+instance ToJSON a => ToJSON (Search a)
49+book :: String -> String -> Int -> Book
54+ [ book "Paul Hudak" "The Haskell School of Expression: Learning Functional Programming through Multimedia" 2000
55+ , book "Bryan O'Sullivan, Don Stewart, and John Goerzen" "Real World Haskell" 2008
56+ , book "Miran Lipovača" "Learn You a Haskell for Great Good!" 2011
57+ , book "Graham Hutton" "Programming in Haskell" 2007
58+ , book "Simon Marlow" "Parallel and Concurrent Programming in Haskell" 2013
59+ , book "Richard Bird" "Introduction to Functional Programming using Haskell" 1998
62+searchBook :: Monad m => Maybe String -> m (Search Book)
63+searchBook Nothing = return (mkSearch "" books)
64+searchBook (Just q) = return (mkSearch q books')
66+ where books' = filter (\b -> q' `isInfixOf` map toLower (author b)
67+ || q' `isInfixOf` map toLower (title b)
72+type API = "point" :> Get '[JSON] Point
73+ :<|> "books" :> QueryParam "q" String :> Get '[JSON] (Search Book)
75+type API' = API :<|> Raw
87+server' :: Server API'
89+ :<|> serveDirectory "getting-started/gs9"
96+ writeFile "getting-started/gs9/api.js" apiJS
97+ jq <- readFile =<< JQ.file
98+ writeFile "getting-started/gs9/jq.js" jq
101+app = serve api' server'