packages feed

hw-mquery-0.0.0.1: src/HaskellWorks/Data/Mini.hs

{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE ScopedTypeVariables        #-}

module HaskellWorks.Data.Mini where

import qualified Data.DList                           as DL
import           Data.List
import           HaskellWorks.Data.Json.PartialValue
import           HaskellWorks.Data.Micro

newtype Mini a = Mini a

instance Show a => Show (Mini [a]) where
  show (Mini xs) = case length xs of
    xsLen | xsLen == 0    -> "[]"
    xsLen | xsLen <= 50   -> "[" ++ intercalate ", " (show `map` xs) ++ "]"
    _                     -> "[" ++ intercalate ", " (show `map` take 50 xs) ++ ", ..]"

instance Show a => Show (Mini (DL.DList a)) where
  showsPrec _ (Mini dxs) = case DL.toList dxs of
    xs@(_:_:_:_:_:_:_:_:_:_:_:_:_)  -> (("[" ++ intercalate ", " (show `map` take 50 xs) ++ ", ..]") ++)
    []                              -> ("[]" ++)
    xs                              -> (("[" ++ intercalate ", " (show `map` xs) ++ "]") ++)

instance Show (Mini JsonPartialValue) where
  showsPrec _ mjpv = case mjpv of
    Mini (JsonPartialString s   ) -> shows s
    Mini (JsonPartialNumber n   ) -> shows n
    Mini (JsonPartialObject []  ) -> ("{}" ++)
    Mini (JsonPartialObject kvs ) -> case kvs of
      (_:_:_:_:_:_:_:_:_:_:_:_:_) -> ("{" ++) . showKvs kvs . (", ..}" ++)
      []                          -> ("{}" ++)
      _                           -> ("{" ++) . showKvs kvs . ("}" ++)
    Mini (JsonPartialArray []   ) -> ("[]" ++)
    Mini (JsonPartialArray vs   ) -> case vs of
      (_:_:_:_:_:_:_:_:_:_:_:_:_) -> ("[" ++) . showVs vs . (", ..]" ++)
      []                          -> ("[]" ++)
      _                           -> ("[" ++) . showVs vs . ("]" ++)
    Mini (JsonPartialBool w     ) -> shows w
    Mini  JsonPartialNull         -> ("null" ++)
    Mini (JsonPartialError s    ) -> ("<error " ++) . shows s . (">" ++)
    where showKvs :: [(String, JsonPartialValue)] -> String -> String
          showKvs (kv:kvs) = shows (Micro kv) . foldl (.) id ((\jv -> (", " ++) . shows (Micro jv)) `map` kvs)
          showKvs []       = id
          showVs :: [JsonPartialValue] -> String -> String
          showVs (kv:kvs) = shows (Micro kv) . foldl (.) id ((\jv -> (", " ++) . shows (Micro jv)) `map` kvs)
          showVs []       = id

instance Show (Mini (String, JsonPartialValue)) where
  showsPrec _ (Mini (fieldName, jpv)) = shows fieldName . (": " ++) . shows (Mini jpv)