git.iko.soy/rowtype-yoga/purescript-native
on 88fdcee help sign in
44 lines 1.1 kB history raw
1{-# LANGUAGE TemplateHaskell #-}
3module Language.PureScript.Kinds where
5import Prelude.Compat
7import qualified Data.Aeson.TH as A
9import Language.PureScript.Names
11-- | The data type of kinds
12data Kind
13 -- | Unification variable of type Kind
14 = KUnknown Int
15 -- | Kinds for labelled, unordered rows without duplicates
16 | Row Kind
17 -- | Function kinds
18 | FunKind Kind Kind
19 -- | A named kind
20 | NamedKind (Qualified (ProperName 'KindName))
21 deriving (Show, Eq, Ord)
23$(A.deriveJSON A.defaultOptions ''Kind)
25everywhereOnKinds :: (Kind -> Kind) -> Kind -> Kind
26everywhereOnKinds f = go
27 where
28 go (Row k1) = f (Row (go k1))
29 go (FunKind k1 k2) = f (FunKind (go k1) (go k2))
30 go other = f other
32everywhereOnKindsM :: Monad m => (Kind -> m Kind) -> Kind -> m Kind
33everywhereOnKindsM f = go
34 where
35 go (Row k1) = (Row <$> go k1) >>= f
36 go (FunKind k1 k2) = (FunKind <$> go k1 <*> go k2) >>= f
37 go other = f other
39everythingOnKinds :: (r -> r -> r) -> (Kind -> r) -> Kind -> r
40everythingOnKinds (<>) f = go
41 where
42 go k@(Row k1) = f k <> go k1
43 go k@(FunKind k1 k2) = f k <> go k1 <> go k2
44 go other = f other