git.iko.soy/rowtype-yoga/purescript-native
on 3ca5543 help sign in
56 lines 1.2 kB history raw
1{-# LANGUAGE TemplateHaskell #-}
3module Language.PureScript.Kinds where
5import Prelude.Compat
7import qualified Data.Aeson.TH as A
9-- |
10-- The data type of kinds
11--
12data Kind
13 -- |
14 -- Unification variable of type Kind
15 --
16 = KUnknown Int
17 -- |
18 -- The kind of types
19 --
20 | Star
21 -- |
22 -- The kind of effects
23 --
24 | Bang
25 -- |
26 -- Kinds for labelled, unordered rows without duplicates
27 --
28 | Row Kind
29 -- |
30 -- Function kinds
31 --
32 | FunKind Kind Kind
33 deriving (Show, Read, Eq, Ord)
35$(A.deriveJSON A.defaultOptions ''Kind)
37everywhereOnKinds :: (Kind -> Kind) -> Kind -> Kind
38everywhereOnKinds f = go
39 where
40 go (Row k1) = f (Row (go k1))
41 go (FunKind k1 k2) = f (FunKind (go k1) (go k2))
42 go other = f other
44everywhereOnKindsM :: Monad m => (Kind -> m Kind) -> Kind -> m Kind
45everywhereOnKindsM f = go
46 where
47 go (Row k1) = (Row <$> go k1) >>= f
48 go (FunKind k1 k2) = (FunKind <$> go k1 <*> go k2) >>= f
49 go other = f other
51everythingOnKinds :: (r -> r -> r) -> (Kind -> r) -> Kind -> r
52everythingOnKinds (<>) f = go
53 where
54 go k@(Row k1) = f k <> go k1
55 go k@(FunKind k1 k2) = f k <> go k1 <> go k2
56 go other = f other