{-# 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