{-# LANGUAGE GeneralizedNewtypeDeriving, TupleSections #-} 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 (Int -> CustomMap q a b -> ShowS [CustomMap q a b] -> ShowS CustomMap q a b -> String (Int -> CustomMap q a b -> ShowS) -> (CustomMap q a b -> String) -> ([CustomMap q a b] -> ShowS) -> Show (CustomMap q a b) forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a forall q a b. Show b => Int -> CustomMap q a b -> ShowS forall q a b. Show b => [CustomMap q a b] -> ShowS forall q a b. Show b => CustomMap q a b -> String showList :: [CustomMap q a b] -> ShowS $cshowList :: forall q a b. Show b => [CustomMap q a b] -> ShowS show :: CustomMap q a b -> String $cshow :: forall q a b. Show b => CustomMap q a b -> String showsPrec :: Int -> CustomMap q a b -> ShowS $cshowsPrec :: forall q a b. Show b => Int -> CustomMap q a b -> ShowS Show, b -> CustomMap q a b -> CustomMap q a b NonEmpty (CustomMap q a b) -> CustomMap q a b CustomMap q a b -> CustomMap q a b -> CustomMap q a b (CustomMap q a b -> CustomMap q a b -> CustomMap q a b) -> (NonEmpty (CustomMap q a b) -> CustomMap q a b) -> (forall b. Integral b => b -> CustomMap q a b -> CustomMap q a b) -> Semigroup (CustomMap q a b) forall b. Integral b => b -> CustomMap q a b -> CustomMap q a b forall a. (a -> a -> a) -> (NonEmpty a -> a) -> (forall b. Integral b => b -> a -> a) -> Semigroup a forall q a b. NonEmpty (CustomMap q a b) -> CustomMap q a b forall q a b. CustomMap q a b -> CustomMap q a b -> CustomMap q a b forall q a b b. Integral b => b -> CustomMap q a b -> CustomMap q a b stimes :: b -> CustomMap q a b -> CustomMap q a b $cstimes :: forall q a b b. Integral b => b -> CustomMap q a b -> CustomMap q a b sconcat :: NonEmpty (CustomMap q a b) -> CustomMap q a b $csconcat :: forall q a b. NonEmpty (CustomMap q a b) -> CustomMap q a b <> :: CustomMap q a b -> CustomMap q a b -> CustomMap q a b $c<> :: forall q a b. CustomMap q a b -> CustomMap q a b -> CustomMap q a b Semigroup, Semigroup (CustomMap q a b) CustomMap q a b Semigroup (CustomMap q a b) -> CustomMap q a b -> (CustomMap q a b -> CustomMap q a b -> CustomMap q a b) -> ([CustomMap q a b] -> CustomMap q a b) -> Monoid (CustomMap q a b) [CustomMap q a b] -> CustomMap q a b CustomMap q a b -> CustomMap q a b -> CustomMap q a b forall a. Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a forall q a b. Semigroup (CustomMap q a b) forall q a b. CustomMap q a b forall q a b. [CustomMap q a b] -> CustomMap q a b forall q a b. CustomMap q a b -> CustomMap q a b -> CustomMap q a b mconcat :: [CustomMap q a b] -> CustomMap q a b $cmconcat :: forall q a b. [CustomMap q a b] -> CustomMap q a b mappend :: CustomMap q a b -> CustomMap q a b -> CustomMap q a b $cmappend :: forall q a b. CustomMap q a b -> CustomMap q a b -> CustomMap q a b mempty :: CustomMap q a b $cmempty :: forall q a b. CustomMap q a b $cp1Monoid :: forall q a b. Semigroup (CustomMap q a b) Monoid) instance Functor (CustomMap q a) where fmap :: (a -> b) -> CustomMap q a a -> CustomMap q a b fmap a -> b f (CustomMap [(q -> Maybe a, a)] l) = [(q -> Maybe a, b)] -> CustomMap q a b forall q a b. [(q -> Maybe a, b)] -> CustomMap q a b CustomMap ([(q -> Maybe a, b)] -> CustomMap q a b) -> [(q -> Maybe a, b)] -> CustomMap q a b forall a b. (a -> b) -> a -> b $ ((q -> Maybe a, a) -> (q -> Maybe a, b)) -> [(q -> Maybe a, a)] -> [(q -> Maybe a, b)] forall a b. (a -> b) -> [a] -> [b] map ((a -> b) -> (q -> Maybe a, a) -> (q -> Maybe a, b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b f) [(q -> Maybe a, a)] l singletonCustom :: (q -> Maybe a) -> b -> CustomMap q a b singletonCustom :: (q -> Maybe a) -> b -> CustomMap q a b singletonCustom q -> Maybe a f b x = [(q -> Maybe a, b)] -> CustomMap q a b forall q a b. [(q -> Maybe a, b)] -> CustomMap q a b CustomMap [(q -> Maybe a f, b x)] lookupCustom :: q -> CustomMap q a b -> [(a, b)] lookupCustom :: q -> CustomMap q a b -> [(a, b)] lookupCustom q q (CustomMap [(q -> Maybe a, b)] l) = ((q -> Maybe a, b) -> Maybe (a, b)) -> [(q -> Maybe a, b)] -> [(a, b)] forall a b. (a -> Maybe b) -> [a] -> [b] mapMaybe (\(q -> Maybe a f, b r) -> (, b r) (a -> (a, b)) -> Maybe a -> Maybe (a, b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> q -> Maybe a f q q) [(q -> Maybe a, b)] l