schema-0.0.3: src/Data/Schema/Deinline.hs
module Data.Schema.Deinline (deinline) where
import Control.Arrow (first)
import Data.Fix (Fix (..), foldFix)
import Data.List (nub)
import Data.Schema (Schema, SchemaF (..), Type (..))
deinline :: Schema -> Schema
deinline = fst . foldFix getTypes
getTypes :: SchemaF (Schema, [Schema]) -> (Schema, [Schema])
getTypes (Atom ty) = (Fix . Atom $ ty, [])
getTypes (Sum dt@(Just (_, ty)) cons) = (Fix . Atom . TyName $ ty, Fix (Sum dt (map fst cons)) : concatMap snd cons)
getTypes (Prod fields) = (Fix . Prod . map fst $ fields, concatMap snd fields)
getTypes (Field name ty) = first (Fix . Field name) ty
getTypes (Con name ty) = first (Fix . Con name) ty
getTypes (List ty) = first (Fix . List) ty
getTypes (Schema mods) = (Fix . Schema . nub . concatMap snd $ mods, [])
getTypes x = error $ "unhandled: " <> show x