{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Greskell.PMap
(
PMap
, lookup
, lookupM
, lookupAs
, lookupAs'
, lookupAsM
, lookupList
, lookupListAs
, lookupListAs'
, pMapInsert
, pMapDelete
, pMapLookup
, pMapToList
, pMapFromList
, Single
, Multi
, PMapKey (..)
, PMapLookupException (..)
, pMapDecribeError
, pMapToThrow
, pMapToFail
) where
import Prelude hiding (lookup)
import Control.Exception (Exception)
import Control.Monad.Catch (MonadCatch (..), MonadThrow (..))
import Control.Monad.Fail (MonadFail)
import Data.Aeson.Types (Parser)
import qualified Data.Foldable as F
import Data.Functor.Identity (Identity)
import Data.Greskell.AsIterator (AsIterator (..))
import Data.Greskell.GMap (GMapEntry)
import Data.Greskell.GraphSON (FromGraphSON (..), GValue, GraphSONTyped (..),
parseEither)
import qualified Data.HashMap.Strict as HM
import Data.Kind (Type)
import Data.List.NonEmpty (NonEmpty ((:|)))
import Data.Maybe (listToMaybe)
import Data.Monoid (Monoid (..))
import Data.Semigroup (Semigroup ((<>)))
import qualified Data.Semigroup as S
import Data.Text (Text, unpack)
import Data.Traversable (Traversable (traverse))
import Data.Greskell.NonEmptyLike (NonEmptyLike)
import qualified Data.Greskell.NonEmptyLike as NEL
newtype PMap c v
= PMap (HM.HashMap Text (c v))
deriving (PMap c v -> PMap c v -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (c :: * -> *) v. Eq (c v) => PMap c v -> PMap c v -> Bool
/= :: PMap c v -> PMap c v -> Bool
$c/= :: forall (c :: * -> *) v. Eq (c v) => PMap c v -> PMap c v -> Bool
== :: PMap c v -> PMap c v -> Bool
$c== :: forall (c :: * -> *) v. Eq (c v) => PMap c v -> PMap c v -> Bool
Eq, forall a. PMap c a -> Bool
forall m a. Monoid m => (a -> m) -> PMap c a -> m
forall a b. (a -> b -> b) -> b -> PMap c a -> b
forall (c :: * -> *) a. (Foldable c, Eq a) => a -> PMap c a -> Bool
forall (c :: * -> *) a. (Foldable c, Num a) => PMap c a -> a
forall (c :: * -> *) a. (Foldable c, Ord a) => PMap c a -> a
forall (c :: * -> *) m. (Foldable c, Monoid m) => PMap c m -> m
forall (c :: * -> *) a. Foldable c => PMap c a -> Bool
forall (c :: * -> *) a. Foldable c => PMap c a -> Int
forall (c :: * -> *) a. Foldable c => PMap c a -> [a]
forall (c :: * -> *) a.
Foldable c =>
(a -> a -> a) -> PMap c a -> a
forall (c :: * -> *) m a.
(Foldable c, Monoid m) =>
(a -> m) -> PMap c a -> m
forall (c :: * -> *) b a.
Foldable c =>
(b -> a -> b) -> b -> PMap c a -> b
forall (c :: * -> *) a b.
Foldable c =>
(a -> b -> b) -> b -> PMap c a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => PMap c a -> a
$cproduct :: forall (c :: * -> *) a. (Foldable c, Num a) => PMap c a -> a
sum :: forall a. Num a => PMap c a -> a
$csum :: forall (c :: * -> *) a. (Foldable c, Num a) => PMap c a -> a
minimum :: forall a. Ord a => PMap c a -> a
$cminimum :: forall (c :: * -> *) a. (Foldable c, Ord a) => PMap c a -> a
maximum :: forall a. Ord a => PMap c a -> a
$cmaximum :: forall (c :: * -> *) a. (Foldable c, Ord a) => PMap c a -> a
elem :: forall a. Eq a => a -> PMap c a -> Bool
$celem :: forall (c :: * -> *) a. (Foldable c, Eq a) => a -> PMap c a -> Bool
length :: forall a. PMap c a -> Int
$clength :: forall (c :: * -> *) a. Foldable c => PMap c a -> Int
null :: forall a. PMap c a -> Bool
$cnull :: forall (c :: * -> *) a. Foldable c => PMap c a -> Bool
toList :: forall a. PMap c a -> [a]
$ctoList :: forall (c :: * -> *) a. Foldable c => PMap c a -> [a]
foldl1 :: forall a. (a -> a -> a) -> PMap c a -> a
$cfoldl1 :: forall (c :: * -> *) a.
Foldable c =>
(a -> a -> a) -> PMap c a -> a
foldr1 :: forall a. (a -> a -> a) -> PMap c a -> a
$cfoldr1 :: forall (c :: * -> *) a.
Foldable c =>
(a -> a -> a) -> PMap c a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> PMap c a -> b
$cfoldl' :: forall (c :: * -> *) b a.
Foldable c =>
(b -> a -> b) -> b -> PMap c a -> b
foldl :: forall b a. (b -> a -> b) -> b -> PMap c a -> b
$cfoldl :: forall (c :: * -> *) b a.
Foldable c =>
(b -> a -> b) -> b -> PMap c a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> PMap c a -> b
$cfoldr' :: forall (c :: * -> *) a b.
Foldable c =>
(a -> b -> b) -> b -> PMap c a -> b
foldr :: forall a b. (a -> b -> b) -> b -> PMap c a -> b
$cfoldr :: forall (c :: * -> *) a b.
Foldable c =>
(a -> b -> b) -> b -> PMap c a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> PMap c a -> m
$cfoldMap' :: forall (c :: * -> *) m a.
(Foldable c, Monoid m) =>
(a -> m) -> PMap c a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> PMap c a -> m
$cfoldMap :: forall (c :: * -> *) m a.
(Foldable c, Monoid m) =>
(a -> m) -> PMap c a -> m
fold :: forall m. Monoid m => PMap c m -> m
$cfold :: forall (c :: * -> *) m. (Foldable c, Monoid m) => PMap c m -> m
Foldable, forall a b. a -> PMap c b -> PMap c a
forall a b. (a -> b) -> PMap c a -> PMap c b
forall (c :: * -> *) a b. Functor c => a -> PMap c b -> PMap c a
forall (c :: * -> *) a b.
Functor c =>
(a -> b) -> PMap c a -> PMap c b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> PMap c b -> PMap c a
$c<$ :: forall (c :: * -> *) a b. Functor c => a -> PMap c b -> PMap c a
fmap :: forall a b. (a -> b) -> PMap c a -> PMap c b
$cfmap :: forall (c :: * -> *) a b.
Functor c =>
(a -> b) -> PMap c a -> PMap c b
Functor, Int -> PMap c v -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
forall (c :: * -> *) v. Show (c v) => Int -> PMap c v -> ShowS
forall (c :: * -> *) v. Show (c v) => [PMap c v] -> ShowS
forall (c :: * -> *) v. Show (c v) => PMap c v -> [Char]
showList :: [PMap c v] -> ShowS
$cshowList :: forall (c :: * -> *) v. Show (c v) => [PMap c v] -> ShowS
show :: PMap c v -> [Char]
$cshow :: forall (c :: * -> *) v. Show (c v) => PMap c v -> [Char]
showsPrec :: Int -> PMap c v -> ShowS
$cshowsPrec :: forall (c :: * -> *) v. Show (c v) => Int -> PMap c v -> ShowS
Show, forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall {c :: * -> *}. Traversable c => Functor (PMap c)
forall {c :: * -> *}. Traversable c => Foldable (PMap c)
forall (c :: * -> *) (m :: * -> *) a.
(Traversable c, Monad m) =>
PMap c (m a) -> m (PMap c a)
forall (c :: * -> *) (f :: * -> *) a.
(Traversable c, Applicative f) =>
PMap c (f a) -> f (PMap c a)
forall (c :: * -> *) (m :: * -> *) a b.
(Traversable c, Monad m) =>
(a -> m b) -> PMap c a -> m (PMap c b)
forall (c :: * -> *) (f :: * -> *) a b.
(Traversable c, Applicative f) =>
(a -> f b) -> PMap c a -> f (PMap c b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> PMap c a -> f (PMap c b)
sequence :: forall (m :: * -> *) a. Monad m => PMap c (m a) -> m (PMap c a)
$csequence :: forall (c :: * -> *) (m :: * -> *) a.
(Traversable c, Monad m) =>
PMap c (m a) -> m (PMap c a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> PMap c a -> m (PMap c b)
$cmapM :: forall (c :: * -> *) (m :: * -> *) a b.
(Traversable c, Monad m) =>
(a -> m b) -> PMap c a -> m (PMap c b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
PMap c (f a) -> f (PMap c a)
$csequenceA :: forall (c :: * -> *) (f :: * -> *) a.
(Traversable c, Applicative f) =>
PMap c (f a) -> f (PMap c a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> PMap c a -> f (PMap c b)
$ctraverse :: forall (c :: * -> *) (f :: * -> *) a b.
(Traversable c, Applicative f) =>
(a -> f b) -> PMap c a -> f (PMap c b)
Traversable)
instance GraphSONTyped (PMap c v) where
gsonTypeFor :: PMap c v -> Text
gsonTypeFor PMap c v
_ = Text
"g:Map"
instance FromGraphSON (c v) => FromGraphSON (PMap c v) where
parseGraphSON :: GValue -> Parser (PMap c v)
parseGraphSON GValue
gv = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (c :: * -> *) v. HashMap Text (c v) -> PMap c v
PMap forall a b. (a -> b) -> a -> b
$ forall a. FromGraphSON a => GValue -> Parser a
parseGraphSON GValue
gv
instance NonEmptyLike c => Semigroup (PMap c v) where
(PMap HashMap Text (c v)
a) <> :: PMap c v -> PMap c v -> PMap c v
<> (PMap HashMap Text (c v)
b) = forall (c :: * -> *) v. HashMap Text (c v) -> PMap c v
PMap (forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
HM.unionWith forall (t :: * -> *) a. NonEmptyLike t => t a -> t a -> t a
NEL.append HashMap Text (c v)
a HashMap Text (c v)
b)
instance NonEmptyLike c => Monoid (PMap c v) where
mempty :: PMap c v
mempty = forall (c :: * -> *) v. HashMap Text (c v) -> PMap c v
PMap forall a b. (a -> b) -> a -> b
$ forall k v. HashMap k v
HM.empty
mappend :: PMap c v -> PMap c v -> PMap c v
mappend = forall a. Semigroup a => a -> a -> a
(<>)
instance AsIterator (PMap c v) where
type IteratorItem (PMap c v) = GMapEntry Text (c v)
pMapInsert :: NonEmptyLike c => Text -> v -> PMap c v -> PMap c v
pMapInsert :: forall (c :: * -> *) v.
NonEmptyLike c =>
Text -> v -> PMap c v -> PMap c v
pMapInsert Text
k v
v (PMap HashMap Text (c v)
hm) = forall (c :: * -> *) v. HashMap Text (c v) -> PMap c v
PMap forall a b. (a -> b) -> a -> b
$ forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
HM.insertWith forall (t :: * -> *) a. NonEmptyLike t => t a -> t a -> t a
NEL.append Text
k (forall (t :: * -> *) a. NonEmptyLike t => a -> t a
NEL.singleton v
v) HashMap Text (c v)
hm
pMapDelete :: Text -> PMap c v -> PMap c v
pMapDelete :: forall (c :: * -> *) v. Text -> PMap c v -> PMap c v
pMapDelete Text
k (PMap HashMap Text (c v)
hm) = forall (c :: * -> *) v. HashMap Text (c v) -> PMap c v
PMap forall a b. (a -> b) -> a -> b
$ forall k v. (Eq k, Hashable k) => k -> HashMap k v -> HashMap k v
HM.delete Text
k HashMap Text (c v)
hm
pMapLookup :: NonEmptyLike c => Text -> PMap c v -> [v]
pMapLookup :: forall (c :: * -> *) v. NonEmptyLike c => Text -> PMap c v -> [v]
pMapLookup Text
k (PMap HashMap Text (c v)
hm) = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. NonEmptyLike t => t a -> NonEmpty a
NEL.toNonEmpty) forall a b. (a -> b) -> a -> b
$ forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HM.lookup Text
k HashMap Text (c v)
hm
pMapToList :: F.Foldable c => PMap c v -> [(Text, v)]
pMapToList :: forall (c :: * -> *) v. Foldable c => PMap c v -> [(Text, v)]
pMapToList (PMap HashMap Text (c v)
hm) = forall {t :: * -> *} {a} {a}. Foldable t => (a, t a) -> [(a, a)]
expandValues forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall k v. HashMap k v -> [(k, v)]
HM.toList HashMap Text (c v)
hm
where
expandValues :: (a, t a) -> [(a, a)]
expandValues (a
k, t a
cv) = forall a b. (a -> b) -> [a] -> [b]
map ((,) a
k) forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList t a
cv
pMapFromList :: NonEmptyLike c => [(Text, v)] -> PMap c v
pMapFromList :: forall (c :: * -> *) v. NonEmptyLike c => [(Text, v)] -> PMap c v
pMapFromList = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
F.foldr forall {c :: * -> *} {v}.
NonEmptyLike c =>
(Text, v) -> PMap c v -> PMap c v
f forall a. Monoid a => a
mempty
where
f :: (Text, v) -> PMap c v -> PMap c v
f (Text
k, v
v) PMap c v
pm = forall (c :: * -> *) v.
NonEmptyLike c =>
Text -> v -> PMap c v -> PMap c v
pMapInsert Text
k v
v PMap c v
pm
lookup :: (PMapKey k, NonEmptyLike c) => k -> PMap c v -> Maybe v
lookup :: forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> Maybe v
lookup k
k PMap c v
pm = forall a. [a] -> Maybe a
listToMaybe forall a b. (a -> b) -> a -> b
$ forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> [v]
lookupList k
k PMap c v
pm
lookupM :: (PMapKey k, NonEmptyLike c, MonadThrow m) => k -> PMap c v -> m v
lookupM :: forall k (c :: * -> *) (m :: * -> *) v.
(PMapKey k, NonEmptyLike c, MonadThrow m) =>
k -> PMap c v -> m v
lookupM k
k PMap c v
pm = forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ Text -> PMapLookupException
PMapNoSuchKey forall a b. (a -> b) -> a -> b
$ forall k. PMapKey k => k -> Text
keyText k
k) forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> Maybe v
lookup k
k PMap c v
pm
lookupAs :: (PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a)
=> k -> PMap c GValue -> Either PMapLookupException a
lookupAs :: forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException a
lookupAs k
k PMap c GValue
pm =
case forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> Maybe v
lookup k
k PMap c GValue
pm of
Maybe GValue
Nothing -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ Text -> PMapLookupException
PMapNoSuchKey Text
kt
Just GValue
gv -> forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> Either a b
Left forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Char] -> PMapLookupException
PMapParseError Text
kt) forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall a. FromGraphSON a => GValue -> Either [Char] a
parseEither GValue
gv
where
kt :: Text
kt = forall k. PMapKey k => k -> Text
keyText k
k
lookupAs' :: (PMapKey k, NonEmptyLike c, PMapValue k ~ (Maybe a), FromGraphSON a)
=> k -> PMap c GValue -> Either PMapLookupException (Maybe a)
lookupAs' :: forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ Maybe a,
FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException (Maybe a)
lookupAs' k
k PMap c GValue
pm = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall {a}.
PMapLookupException -> Either PMapLookupException (Maybe a)
fromError forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException a
lookupAs k
k PMap c GValue
pm
where
fromError :: PMapLookupException -> Either PMapLookupException (Maybe a)
fromError (PMapNoSuchKey Text
_) = forall a b. b -> Either a b
Right forall a. Maybe a
Nothing
fromError PMapLookupException
e = forall a b. a -> Either a b
Left PMapLookupException
e
lookupAsM :: (PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a, MonadThrow m)
=> k -> PMap c GValue -> m a
lookupAsM :: forall k (c :: * -> *) a (m :: * -> *).
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a,
MonadThrow m) =>
k -> PMap c GValue -> m a
lookupAsM k
k PMap c GValue
pm = forall (m :: * -> *) a.
MonadThrow m =>
Either PMapLookupException a -> m a
pMapToThrow forall a b. (a -> b) -> a -> b
$ forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException a
lookupAs k
k PMap c GValue
pm
lookupList :: (PMapKey k, NonEmptyLike c) => k -> PMap c v -> [v]
lookupList :: forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> [v]
lookupList k
k PMap c v
pm = forall (c :: * -> *) v. NonEmptyLike c => Text -> PMap c v -> [v]
pMapLookup (forall k. PMapKey k => k -> Text
keyText k
k) PMap c v
pm
lookupListAs :: (PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a)
=> k -> PMap c GValue -> Either PMapLookupException (NonEmpty a)
lookupListAs :: forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException (NonEmpty a)
lookupListAs k
k PMap c GValue
pm =
case forall k (c :: * -> *) v.
(PMapKey k, NonEmptyLike c) =>
k -> PMap c v -> [v]
lookupList k
k PMap c GValue
pm of
[] -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ Text -> PMapLookupException
PMapNoSuchKey Text
kt
(GValue
x : [GValue]
rest) -> forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> Either a b
Left forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Char] -> PMapLookupException
PMapParseError Text
kt) forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall a. FromGraphSON a => GValue -> Either [Char] a
parseEither (GValue
x forall a. a -> [a] -> NonEmpty a
:| [GValue]
rest)
where
kt :: Text
kt = forall k. PMapKey k => k -> Text
keyText k
k
lookupListAs' :: (PMapKey k, NonEmptyLike c, PMapValue k ~ (Maybe a), FromGraphSON a)
=> k -> PMap c GValue -> Either PMapLookupException [Maybe a]
lookupListAs' :: forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ Maybe a,
FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException [Maybe a]
lookupListAs' k
k PMap c GValue
pm = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall {a}. PMapLookupException -> Either PMapLookupException [a]
fromError (forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList) forall a b. (a -> b) -> a -> b
$ forall k (c :: * -> *) a.
(PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) =>
k -> PMap c GValue -> Either PMapLookupException (NonEmpty a)
lookupListAs k
k PMap c GValue
pm
where
fromError :: PMapLookupException -> Either PMapLookupException [a]
fromError (PMapNoSuchKey Text
_) = forall a b. b -> Either a b
Right []
fromError PMapLookupException
e = forall a b. a -> Either a b
Left PMapLookupException
e
type Single = S.First
newtype Multi a
= Multi (NonEmpty a)
deriving (Multi a -> Multi a -> Bool
forall a. Eq a => Multi a -> Multi a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Multi a -> Multi a -> Bool
$c/= :: forall a. Eq a => Multi a -> Multi a -> Bool
== :: Multi a -> Multi a -> Bool
$c== :: forall a. Eq a => Multi a -> Multi a -> Bool
Eq, forall a. Eq a => a -> Multi a -> Bool
forall a. Num a => Multi a -> a
forall a. Ord a => Multi a -> a
forall m. Monoid m => Multi m -> m
forall a. Multi a -> Bool
forall a. Multi a -> Int
forall a. Multi a -> [a]
forall a. (a -> a -> a) -> Multi a -> a
forall m a. Monoid m => (a -> m) -> Multi a -> m
forall b a. (b -> a -> b) -> b -> Multi a -> b
forall a b. (a -> b -> b) -> b -> Multi a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => Multi a -> a
$cproduct :: forall a. Num a => Multi a -> a
sum :: forall a. Num a => Multi a -> a
$csum :: forall a. Num a => Multi a -> a
minimum :: forall a. Ord a => Multi a -> a
$cminimum :: forall a. Ord a => Multi a -> a
maximum :: forall a. Ord a => Multi a -> a
$cmaximum :: forall a. Ord a => Multi a -> a
elem :: forall a. Eq a => a -> Multi a -> Bool
$celem :: forall a. Eq a => a -> Multi a -> Bool
length :: forall a. Multi a -> Int
$clength :: forall a. Multi a -> Int
null :: forall a. Multi a -> Bool
$cnull :: forall a. Multi a -> Bool
toList :: forall a. Multi a -> [a]
$ctoList :: forall a. Multi a -> [a]
foldl1 :: forall a. (a -> a -> a) -> Multi a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Multi a -> a
foldr1 :: forall a. (a -> a -> a) -> Multi a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> Multi a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Multi a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Multi a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Multi a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Multi a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Multi a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Multi a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Multi a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> Multi a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> Multi a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Multi a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Multi a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Multi a -> m
fold :: forall m. Monoid m => Multi m -> m
$cfold :: forall m. Monoid m => Multi m -> m
Foldable, GValue -> Parser (Multi a)
forall a. FromGraphSON a => GValue -> Parser (Multi a)
forall a. (GValue -> Parser a) -> FromGraphSON a
parseGraphSON :: GValue -> Parser (Multi a)
$cparseGraphSON :: forall a. FromGraphSON a => GValue -> Parser (Multi a)
FromGraphSON, forall a b. a -> Multi b -> Multi a
forall a b. (a -> b) -> Multi a -> Multi b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Multi b -> Multi a
$c<$ :: forall a b. a -> Multi b -> Multi a
fmap :: forall a b. (a -> b) -> Multi a -> Multi b
$cfmap :: forall a b. (a -> b) -> Multi a -> Multi b
Functor, Foldable Multi
forall a. a -> Multi a
forall a. Multi a -> NonEmpty a
forall a. Multi a -> Multi a -> Multi a
forall (t :: * -> *).
Foldable t
-> (forall a. a -> t a)
-> (forall a. t a -> t a -> t a)
-> (forall a. t a -> NonEmpty a)
-> NonEmptyLike t
toNonEmpty :: forall a. Multi a -> NonEmpty a
$ctoNonEmpty :: forall a. Multi a -> NonEmpty a
append :: forall a. Multi a -> Multi a -> Multi a
$cappend :: forall a. Multi a -> Multi a -> Multi a
singleton :: forall a. a -> Multi a
$csingleton :: forall a. a -> Multi a
NonEmptyLike, Multi a -> Multi a -> Bool
Multi a -> Multi a -> Ordering
Multi a -> Multi a -> Multi a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Multi a)
forall a. Ord a => Multi a -> Multi a -> Bool
forall a. Ord a => Multi a -> Multi a -> Ordering
forall a. Ord a => Multi a -> Multi a -> Multi a
min :: Multi a -> Multi a -> Multi a
$cmin :: forall a. Ord a => Multi a -> Multi a -> Multi a
max :: Multi a -> Multi a -> Multi a
$cmax :: forall a. Ord a => Multi a -> Multi a -> Multi a
>= :: Multi a -> Multi a -> Bool
$c>= :: forall a. Ord a => Multi a -> Multi a -> Bool
> :: Multi a -> Multi a -> Bool
$c> :: forall a. Ord a => Multi a -> Multi a -> Bool
<= :: Multi a -> Multi a -> Bool
$c<= :: forall a. Ord a => Multi a -> Multi a -> Bool
< :: Multi a -> Multi a -> Bool
$c< :: forall a. Ord a => Multi a -> Multi a -> Bool
compare :: Multi a -> Multi a -> Ordering
$ccompare :: forall a. Ord a => Multi a -> Multi a -> Ordering
Ord, NonEmpty (Multi a) -> Multi a
Multi a -> Multi a -> Multi a
forall b. Integral b => b -> Multi a -> Multi a
forall a. NonEmpty (Multi a) -> Multi a
forall a. Multi a -> Multi a -> Multi a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> Multi a -> Multi a
stimes :: forall b. Integral b => b -> Multi a -> Multi a
$cstimes :: forall a b. Integral b => b -> Multi a -> Multi a
sconcat :: NonEmpty (Multi a) -> Multi a
$csconcat :: forall a. NonEmpty (Multi a) -> Multi a
<> :: Multi a -> Multi a -> Multi a
$c<> :: forall a. Multi a -> Multi a -> Multi a
Semigroup, Int -> Multi a -> ShowS
forall a. Show a => Int -> Multi a -> ShowS
forall a. Show a => [Multi a] -> ShowS
forall a. Show a => Multi a -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Multi a] -> ShowS
$cshowList :: forall a. Show a => [Multi a] -> ShowS
show :: Multi a -> [Char]
$cshow :: forall a. Show a => Multi a -> [Char]
showsPrec :: Int -> Multi a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Multi a -> ShowS
Show, Functor Multi
Foldable Multi
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Multi (m a) -> m (Multi a)
forall (f :: * -> *) a. Applicative f => Multi (f a) -> f (Multi a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Multi a -> m (Multi b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Multi a -> f (Multi b)
sequence :: forall (m :: * -> *) a. Monad m => Multi (m a) -> m (Multi a)
$csequence :: forall (m :: * -> *) a. Monad m => Multi (m a) -> m (Multi a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Multi a -> m (Multi b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Multi a -> m (Multi b)
sequenceA :: forall (f :: * -> *) a. Applicative f => Multi (f a) -> f (Multi a)
$csequenceA :: forall (f :: * -> *) a. Applicative f => Multi (f a) -> f (Multi a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Multi a -> f (Multi b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Multi a -> f (Multi b)
Traversable)
class PMapKey k where
type PMapValue k :: Type
keyText :: k -> Text
instance PMapKey Text where
type PMapValue Text = GValue
keyText :: Text -> Text
keyText = forall a. a -> a
id
data PMapLookupException
= PMapNoSuchKey Text
| PMapParseError Text String
deriving (PMapLookupException -> PMapLookupException -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PMapLookupException -> PMapLookupException -> Bool
$c/= :: PMapLookupException -> PMapLookupException -> Bool
== :: PMapLookupException -> PMapLookupException -> Bool
$c== :: PMapLookupException -> PMapLookupException -> Bool
Eq, Eq PMapLookupException
PMapLookupException -> PMapLookupException -> Bool
PMapLookupException -> PMapLookupException -> Ordering
PMapLookupException -> PMapLookupException -> PMapLookupException
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PMapLookupException -> PMapLookupException -> PMapLookupException
$cmin :: PMapLookupException -> PMapLookupException -> PMapLookupException
max :: PMapLookupException -> PMapLookupException -> PMapLookupException
$cmax :: PMapLookupException -> PMapLookupException -> PMapLookupException
>= :: PMapLookupException -> PMapLookupException -> Bool
$c>= :: PMapLookupException -> PMapLookupException -> Bool
> :: PMapLookupException -> PMapLookupException -> Bool
$c> :: PMapLookupException -> PMapLookupException -> Bool
<= :: PMapLookupException -> PMapLookupException -> Bool
$c<= :: PMapLookupException -> PMapLookupException -> Bool
< :: PMapLookupException -> PMapLookupException -> Bool
$c< :: PMapLookupException -> PMapLookupException -> Bool
compare :: PMapLookupException -> PMapLookupException -> Ordering
$ccompare :: PMapLookupException -> PMapLookupException -> Ordering
Ord, Int -> PMapLookupException -> ShowS
[PMapLookupException] -> ShowS
PMapLookupException -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [PMapLookupException] -> ShowS
$cshowList :: [PMapLookupException] -> ShowS
show :: PMapLookupException -> [Char]
$cshow :: PMapLookupException -> [Char]
showsPrec :: Int -> PMapLookupException -> ShowS
$cshowsPrec :: Int -> PMapLookupException -> ShowS
Show)
instance Exception PMapLookupException
pMapDecribeError :: PMapLookupException -> String
pMapDecribeError :: PMapLookupException -> [Char]
pMapDecribeError (PMapNoSuchKey Text
k) = [Char]
"Property '" forall a. [a] -> [a] -> [a]
++ Text -> [Char]
unpack Text
k forall a. [a] -> [a] -> [a]
++ [Char]
"' does not exist."
pMapDecribeError (PMapParseError Text
k [Char]
pe) = [Char]
"Parse error of property '" forall a. [a] -> [a] -> [a]
++ Text -> [Char]
unpack Text
k forall a. [a] -> [a] -> [a]
++ [Char]
"': " forall a. [a] -> [a] -> [a]
++ [Char]
pe
pMapToThrow :: MonadThrow m => Either PMapLookupException a -> m a
pMapToThrow :: forall (m :: * -> *) a.
MonadThrow m =>
Either PMapLookupException a -> m a
pMapToThrow (Left PMapLookupException
e) = forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM PMapLookupException
e
pMapToThrow (Right a
a) = forall (m :: * -> *) a. Monad m => a -> m a
return a
a
pMapToFail :: MonadFail m => Either PMapLookupException a -> m a
pMapToFail :: forall (m :: * -> *) a.
MonadFail m =>
Either PMapLookupException a -> m a
pMapToFail (Left PMapLookupException
e) = forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail forall a b. (a -> b) -> a -> b
$ PMapLookupException -> [Char]
pMapDecribeError PMapLookupException
e
pMapToFail (Right a
a) = forall (m :: * -> *) a. Monad m => a -> m a
return a
a