{-# LANGUAGE OverloadedStrings #-} module GitHub.Types.Json where import Data.Aeson (ToJSON (..), Value (..)) import qualified Data.Aeson.Key as Key import qualified Data.Aeson.KeyMap as KeyMap import qualified Data.Text as Text import qualified Data.Vector as V removeNulls :: ToJSON a => a -> Value removeNulls :: a -> Value removeNulls = Value -> Value go (Value -> Value) -> (a -> Value) -> a -> Value forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> Value forall a. ToJSON a => a -> Value toJSON where go :: Value -> Value go (Array Array x) = Array -> Value Array (Array -> Value) -> (Array -> Array) -> Array -> Value forall b c a. (b -> c) -> (a -> b) -> a -> c . (Value -> Value) -> Array -> Array forall a b. (a -> b) -> Vector a -> Vector b V.map Value -> Value go (Array -> Value) -> Array -> Value forall a b. (a -> b) -> a -> b $ Array x go (Object Object x) = Object -> Value Object (Object -> Value) -> (Object -> Object) -> Object -> Value forall b c a. (b -> c) -> (a -> b) -> a -> c . (Value -> Value) -> Object -> Object forall a b. (a -> b) -> KeyMap a -> KeyMap b KeyMap.map Value -> Value go (Object -> Object) -> (Object -> Object) -> Object -> Object forall b c a. (b -> c) -> (a -> b) -> a -> c . (Key -> Value -> Bool) -> Object -> Object forall v. (Key -> v -> Bool) -> KeyMap v -> KeyMap v KeyMap.filterWithKey Key -> Value -> Bool validPair (Object -> Value) -> Object -> Value forall a b. (a -> b) -> a -> b $ Object x go Value x = Value x isEmpty :: Value -> Bool isEmpty Value Null = Bool True isEmpty (Array Array x) = Array -> Bool forall (t :: * -> *) a. Foldable t => t a -> Bool null Array x isEmpty Value _ = Bool False validPair :: Key -> Value -> Bool validPair Key k Value v = Bool -> Bool not (Value -> Bool isEmpty Value v Bool -> Bool -> Bool || Text "x-" Text -> Text -> Bool `Text.isPrefixOf` Key -> Text Key.toText Key k) valueIntersection :: Value -> Value -> Value valueIntersection :: Value -> Value -> Value valueIntersection (Object Object x) (Object Object y) = Object -> Value Object (Object -> Value) -> Object -> Value forall a b. (a -> b) -> a -> b $ (Value -> Value -> Value) -> Object -> Object -> Object forall a b c. (a -> b -> c) -> KeyMap a -> KeyMap b -> KeyMap c KeyMap.intersectionWith Value -> Value -> Value valueIntersection Object x Object y valueIntersection (Array Array x) (Array Array y) = Array -> Value Array (Array -> Value) -> Array -> Value forall a b. (a -> b) -> a -> b $ (Value -> Bool) -> Array -> Array forall a. (a -> Bool) -> Vector a -> Vector a V.filter (Value -> Value -> Bool forall a. Eq a => a -> a -> Bool /= Value Null) (Array -> Array) -> Array -> Array forall a b. (a -> b) -> a -> b $ (Value -> Value -> Value) -> Array -> Array -> Array forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c V.zipWith Value -> Value -> Value valueIntersection Array x Array y valueIntersection Value _ Value y = Value y