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