{-# LANGUAGE OverloadedStrings #-}
module Network.MQTT.Topic (
Filter, Topic, match
) where
import Data.Text (Text, isPrefixOf, splitOn)
type Topic = Text
type Filter = Text
match :: Filter -> Topic -> Bool
match :: Filter -> Filter -> Bool
match Filter
pat Filter
top = [Filter] -> [Filter] -> Bool
cmp (Filter -> Filter -> [Filter]
splitOn Filter
"/" Filter
pat) (Filter -> Filter -> [Filter]
splitOn Filter
"/" Filter
top)
where
cmp :: [Filter] -> [Filter] -> Bool
cmp [] [] = Bool
True
cmp [] [Filter]
_ = Bool
False
cmp [Filter]
_ [] = Bool
False
cmp [Filter
"#"] (Filter
t:[Filter]
_) = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Filter
"$" Filter -> Filter -> Bool
`isPrefixOf` Filter
t
cmp (Filter
p:[Filter]
ps) (Filter
t:[Filter]
ts)
| Filter
p Filter -> Filter -> Bool
forall a. Eq a => a -> a -> Bool
== Filter
t = [Filter] -> [Filter] -> Bool
cmp [Filter]
ps [Filter]
ts
| Filter
p Filter -> Filter -> Bool
forall a. Eq a => a -> a -> Bool
== Filter
"+" Bool -> Bool -> Bool
&& Bool -> Bool
not (Filter
"$" Filter -> Filter -> Bool
`isPrefixOf` Filter
t) = [Filter] -> [Filter] -> Bool
cmp [Filter]
ps [Filter]
ts
| Bool
otherwise = Bool
False