module Web.Route.Invertible.Map.Custom
( CustomMap
, singletonCustom
, lookupCustom
) where
import Data.Maybe (mapMaybe)
import Text.Show.Functions ()
newtype CustomMap q a b = CustomMap [(q -> Maybe a, b)]
deriving (Show, Monoid)
instance Functor (CustomMap q a) where
fmap f (CustomMap l) = CustomMap $ map (fmap f) l
singletonCustom :: (q -> Maybe a) -> b -> CustomMap q a b
singletonCustom f x = CustomMap [(f, x)]
lookupCustom :: q -> CustomMap q a b -> [(a, b)]
lookupCustom q (CustomMap l) = mapMaybe (\(f, r) -> (, r) <$> f q) l