git.iko.soy/rowtype-yoga/purescript-native
on 330bab9 help sign in
68 lines 1.6 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : Language.PureScript.Kinds
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- |
12--
13-----------------------------------------------------------------------------
15{-# LANGUAGE DeriveDataTypeable #-}
17module Language.PureScript.Kinds where
19import Data.Data
21import Control.Applicative
22import Control.Monad.Unify (Unknown)
24-- |
25-- The data type of kinds
26--
27data Kind
28 -- |
29 -- Unification variable of type Kind
30 --
31 = KUnknown Unknown
32 -- |
33 -- The kind of types
34 --
35 | Star
36 -- |
37 -- The kind of effects
38 --
39 | Bang
40 -- |
41 -- Kinds for labelled, unordered rows without duplicates
42 --
43 | Row Kind
44 -- |
45 -- Function kinds
46 --
47 | FunKind Kind Kind deriving (Show, Eq, Data, Typeable)
49everywhereOnKinds :: (Kind -> Kind) -> Kind -> Kind
50everywhereOnKinds f = go
51 where
52 go (Row k1) = f (Row (go k1))
53 go (FunKind k1 k2) = f (FunKind (go k1) (go k2))
54 go other = f other
56everywhereOnKindsM :: (Functor m, Applicative m, Monad m) => (Kind -> m Kind) -> Kind -> m Kind
57everywhereOnKindsM f = go
58 where
59 go (Row k1) = (Row <$> go k1) >>= f
60 go (FunKind k1 k2) = (FunKind <$> go k1 <*> go k2) >>= f
61 go other = f other
63everythingOnKinds :: (r -> r -> r) -> (Kind -> r) -> Kind -> r
64everythingOnKinds (<>) f = go
65 where
66 go k@(Row k1) = f k <> go k1
67 go k@(FunKind k1 k2) = f k <> go k1 <> go k2
68 go other = f other