{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
module Database.MSSQLServer.Query.ResultSet ( ResultSet (..)
, Result
) where
import Control.Applicative((<$>),Applicative((<*>)),Alternative(empty))
import Database.Tds.Message
import Database.MSSQLServer.Query.Row
import Database.MSSQLServer.Query.Only
import Database.MSSQLServer.Query.TokenStreamParser
class ResultSet a where
fromTokenStreams :: [TokenStream] -> a
instance ResultSet () where
fromTokenStreams xs = case parse noResult xs of
[] -> error "fromTokenStreams(ResultSet ()): failed to parse"
(x,_):_ -> x
instance (Row a) => ResultSet [a] where
fromTokenStreams xs = case parse listOfRow xs of
[] -> error "fromTokenStreams(ResultSet [Row a]): failed to parse"
(x,_):_ -> x
instance ResultSet Int where
fromTokenStreams xs = case parse rowCount xs of
[] -> error "fromTokenStreams(ResultSet Int): failed to parse"
(x,_):_ -> x
instance (Result a, Result b) => ResultSet (a, b) where
fromTokenStreams xs = case parse p xs of
[] -> error "fromTokenStreams(ResultSet (Result a, Result b)): failed to parse"
(x,_):_ -> x
where
p :: (Result a, Result b) => Parser (a, b)
p = do
!r1 <- resultParser :: (Result a) => Parser a
!r2 <- resultParser :: (Result b) => Parser b
return (r1,r2)
instance (Result a, Result b, Result c) => ResultSet (a, b, c) where
fromTokenStreams xs = case parse p xs of
[] -> error "fromTokenStreams(ResultSet (Result a, Result b, Result c)): failed to parse"
(x,_):_ -> x
where
p :: (Result a, Result b, Result c) => Parser (a, b, c)
p = do
!r1 <- resultParser :: (Result a) => Parser a
!r2 <- resultParser :: (Result b) => Parser b
!r3 <- resultParser :: (Result c) => Parser c
return (r1,r2,r3)
instance (Result a, Result b, Result c, Result d) => ResultSet (a, b, c, d) where
fromTokenStreams xs = case parse p xs of
[] -> error "fromTokenStreams(ResultSet (Result a, Result b, Result c, Result d)): failed to parse"
(x,_):_ -> x
where
p :: (Result a, Result b, Result c, Result d) => Parser (a, b, c, d)
p = do
!r1 <- resultParser :: (Result a) => Parser a
!r2 <- resultParser :: (Result b) => Parser b
!r3 <- resultParser :: (Result c) => Parser c
!r4 <- resultParser :: (Result d) => Parser d
return (r1,r2,r3,r4)
instance (Result a, Result b, Result c, Result d, Result e) => ResultSet (a, b, c, d, e) where
fromTokenStreams xs = case parse p xs of
[] -> error "fromTokenStreams(ResultSet (Result a, Result b, Result c, Result d, Result e)): failed to parse"
(x,_):_ -> x
where
p :: (Result a, Result b, Result c, Result d, Result e) => Parser (a, b, c, d, e)
p = do
!r1 <- resultParser :: (Result a) => Parser a
!r2 <- resultParser :: (Result b) => Parser b
!r3 <- resultParser :: (Result c) => Parser c
!r4 <- resultParser :: (Result d) => Parser d
!r5 <- resultParser :: (Result e) => Parser e
return (r1,r2,r3,r4,r5)
class Result a where
resultParser :: Parser a
instance Result () where
resultParser = noResult
instance Row a => Result [a] where
resultParser = listOfRow
instance Result Int where
resultParser = rowCount