Skip to content

Commit

Permalink
Add Conversion monad
Browse files Browse the repository at this point in the history
  • Loading branch information
lpsmith committed Jan 28, 2013
1 parent e4eb4e6 commit eec01a8
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/Database/PostgreSQL/Simple/Internal.hs
Expand Up @@ -293,3 +293,38 @@ data Row = Row {


newtype RowParser a = RP { unRP :: ReaderT Row (StateT PQ.Column Ok) a } newtype RowParser a = RP { unRP :: ReaderT Row (StateT PQ.Column Ok) a }
deriving ( Functor, Applicative, Alternative, Monad ) deriving ( Functor, Applicative, Alternative, Monad )

newtype Conversion a = Conversion { runConversion :: Connection -> IO (Ok a) }

instance Functor Conversion where
fmap f m = Conversion $ \conn -> (fmap . fmap) f (runConversion m conn)

instance Applicative Conversion where
pure a = Conversion $ \_conn -> pure (pure a)
mf <*> ma = Conversion $ \conn -> do
okf <- runConversion mf conn
case okf of
Ok f -> (fmap . fmap) f (runConversion ma conn)
Errors errs -> return (Errors errs)

instance Alternative Conversion where
empty = Conversion $ \_conn -> pure empty
ma <|> mb = Conversion $ \conn -> do
oka <- runConversion ma conn
case oka of
Ok _ -> return oka
Errors _ -> (oka <|>) <$> runConversion mb conn

instance Monad Conversion where
return a = Conversion $ \_conn -> return (return a)
m >>= f = Conversion $ \conn -> do
oka <- runConversion m conn
case oka of
Ok a -> runConversion (f a) conn
Errors err -> return (Errors err)

conversionMap :: (Ok a -> Ok b) -> Conversion a -> Conversion b
conversionMap f m = Conversion $ \conn -> f <$> runConversion m conn

conversionError :: Exception err => err -> Conversion a
conversionError err = Conversion $ \_ -> return (Errors [SomeException err])

0 comments on commit eec01a8

Please sign in to comment.