snaplet-mongoDB-0.2: src/Snap/Snaplet/MongoDB/FilterOps.hs
{-# LANGUAGE OverloadedStrings #-}
module Snap.Snaplet.MongoDB.FilterOps
( FilterOp
, (==?)
, (/=?)
, eq, ne, lt, lte, gt, gte
, or, ors
, isIn, notIn
, UpdateOp
, (==:)
, set
, inc, dec
, pop, push, pull, pushAll, pullAll
, addToSet, addManyToSet
) where
import Prelude hiding (or)
import qualified Data.Bson as BSON
import Snap.Snaplet.MongoDB.MongoValue
import Snap.Snaplet.MongoDB.MongoEntity
infix 0 ==? -- Alias to eq operation
infix 0 /=? -- Alias to neq operation
infix 0 ==: -- Alias to set operation
type FilterOp = BSON.Field
(==?), (/=?), (==:) :: (MongoEntity a, MongoValue v) => (v -> Filter a) -> v -> FilterOp
(==?) = eq
(/=?) = ne
(==:) = set
stdFilterDef :: (MongoEntity a, MongoValue v) => BSON.Label -> (v -> Filter a) -> v -> FilterOp
stdFilterDef op f v =
filterFieldName (f undefined) := BSON.Doc [op := toValue v]
eq, ne, lt, lte, gt, gte :: (MongoEntity a, MongoValue v) => (v -> Filter a) -> v -> FilterOp
eq f v = filterFieldName (f undefined) := toValue v
ne = stdFilterDef "$ne"
lt = stdFilterDef "$lt"
lte = stdFilterDef "$lte"
gt = stdFilterDef "$gt"
gte = stdFilterDef "$gte"
or :: BSON.Field -> BSON.Field -> FilterOp
or x y = "$or" := BSON.Doc [x, y]
ors :: [BSON.Field] -> BSON.Field
ors fs = "$or" := BSON.Doc fs
isIn, notIn :: (MongoEntity a, MongoValue v) => (v -> Filter a) -> [v] -> FilterOp
isIn f vs = filterFieldName (f undefined) := BSON.Doc [ "$in" := BSON.Array (map toValue vs) ]
notIn f vs = filterFieldName (f undefined) := BSON.Doc [ "$nin" := BSON.Array (map toValue vs) ]
type UpdateOp = BSON.Field
set :: (MongoEntity a, MongoValue v) => (v -> Filter a) -> v -> UpdateOp
set f v = "$set" := BSON.Doc [ filterFieldName (f v) := toValue v ]
inc, dec :: (MongoEntity a, Num v, MongoValue v) => (v -> Filter a) -> v -> UpdateOp
inc f v = "$inc" := BSON.Doc [ filterFieldName (f v) := toValue v ]
dec f v = "$dec" := BSON.Doc [ filterFieldName (f v) := toValue v ]
push, addToSet, pull :: (MongoEntity a, MongoValue v) => ([v] -> Filter a) -> v -> UpdateOp
push f v = "$push" := BSON.Doc [ filterFieldName (f [v]) := toValue v ]
addToSet f v = "$addToSet" := BSON.Doc [ filterFieldName (f undefined) := toValue v ]
pull f v = "$pull" := BSON.Doc [ filterFieldName (f undefined) := toValue v ]
pushAll, pullAll, addManyToSet :: (MongoEntity a, MongoValue v) => ([v] -> Filter a) -> [v] -> UpdateOp
pushAll f v = "$pushAll" := BSON.Doc [ filterFieldName (f undefined) := BSON.Array (map toValue v) ]
pullAll f v = "$pullAll" := BSON.Doc [ filterFieldName (f undefined) := BSON.Array (map toValue v) ]
addManyToSet f v = "$addToSet" := BSON.Doc [ filterFieldName (f undefined) := BSON.Doc [ "$each" := BSON.Array (map toValue v) ] ]
pop :: (MongoEntity a, MongoValue v) => ([v] -> Filter a) -> UpdateOp
pop f = "$pop" := BSON.Doc [ filterFieldName (f undefined) := BSON.Int32 1 ]
-- Local Variables:
-- mode : Haskell
-- fill-column : 120
-- default-justification : left
-- End: