{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Data.Aeson.Schema.Utils.All
( All(..)
) where
import Data.Proxy (Proxy(..))
class All f xs where
mapAll :: forall a. (forall x. f x => Proxy x -> a) -> [a]
mapAll f = foldrAll @f @xs f' []
where
f' :: forall x. f x => Proxy x -> [a] -> [a]
f' proxy acc = f proxy : acc
foldrAll :: (forall x. f x => Proxy x -> a -> a) -> a -> a
instance All f '[] where
foldrAll _ acc = acc
instance (f x, All f xs) => All f (x ': xs) where
foldrAll f acc = f (Proxy @x) (foldrAll @f @xs f acc)