module Restyler.Config.SketchyList ( SketchyList , unSketchy ) where import Prelude import Data.Aeson import Data.Aeson.Types (typeMismatch) data SketchyList a = One a | Many [a] deriving (SketchyList a -> SketchyList a -> Bool (SketchyList a -> SketchyList a -> Bool) -> (SketchyList a -> SketchyList a -> Bool) -> Eq (SketchyList a) forall a. Eq a => SketchyList a -> SketchyList a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: SketchyList a -> SketchyList a -> Bool $c/= :: forall a. Eq a => SketchyList a -> SketchyList a -> Bool == :: SketchyList a -> SketchyList a -> Bool $c== :: forall a. Eq a => SketchyList a -> SketchyList a -> Bool Eq, Int -> SketchyList a -> ShowS [SketchyList a] -> ShowS SketchyList a -> String (Int -> SketchyList a -> ShowS) -> (SketchyList a -> String) -> ([SketchyList a] -> ShowS) -> Show (SketchyList a) forall a. Show a => Int -> SketchyList a -> ShowS forall a. Show a => [SketchyList a] -> ShowS forall a. Show a => SketchyList a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [SketchyList a] -> ShowS $cshowList :: forall a. Show a => [SketchyList a] -> ShowS show :: SketchyList a -> String $cshow :: forall a. Show a => SketchyList a -> String showsPrec :: Int -> SketchyList a -> ShowS $cshowsPrec :: forall a. Show a => Int -> SketchyList a -> ShowS Show) unSketchy :: SketchyList a -> [a] unSketchy :: SketchyList a -> [a] unSketchy (One i :: a i) = [a i] unSketchy (Many is :: [a] is) = [a] is instance FromJSON a => FromJSON (SketchyList a) where parseJSON :: Value -> Parser (SketchyList a) parseJSON i :: Value i@(String _) = a -> SketchyList a forall a. a -> SketchyList a One (a -> SketchyList a) -> Parser a -> Parser (SketchyList a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Value -> Parser a forall a. FromJSON a => Value -> Parser a parseJSON Value i parseJSON is :: Value is@(Array _) = [a] -> SketchyList a forall a. [a] -> SketchyList a Many ([a] -> SketchyList a) -> Parser [a] -> Parser (SketchyList a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Value -> Parser [a] forall a. FromJSON a => Value -> Parser a parseJSON Value is parseJSON x :: Value x = String -> Value -> Parser (SketchyList a) forall a. String -> Value -> Parser a typeMismatch "item or list of items" Value x