packages feed

sprinkles-0.3.5.0: src/Data/Walk.hs

{-#LANGUAGE MultiParamTypeClasses #-}
{-#LANGUAGE FlexibleInstances #-}

module Data.Walk
( Walk (..)
)
where

import qualified Data.Aeson as JSON
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap

class Walk c e where
    walk :: (e -> e) -> (c -> c)

instance Walk JSON.Value Text where
    walk = jsonTextWalk

jsonTextWalk :: (Text -> Text) -> (JSON.Value -> JSON.Value)
jsonTextWalk f (JSON.String t) = JSON.String (f t)
jsonTextWalk f (JSON.Array v) = JSON.Array (fmap (walk f) v)
jsonTextWalk f (JSON.Object m) =
    JSON.Object . HashMap.fromList $
        [ (f k, walk f v) | (k, v) <- HashMap.toList m ]
jsonTextWalk _ x = x

instance Walk [a] a where
    walk = map

instance Walk (Maybe a) a where
    walk = fmap