Skip to content

Commit

Permalink
Add Mirror and Snoc type classes to Symbol
Browse files Browse the repository at this point in the history
  • Loading branch information
csicar committed Aug 8, 2019
1 parent 82b343f commit e07bec7
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/Type/Data/Symbol.purs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ module Type.Data.Symbol
, compare
, uncons
, class Equals
, class Mirror
, class MirrorP
, mirror
, class Snoc
, snoc
, equals
) where

Expand Down Expand Up @@ -36,3 +41,35 @@ instance equalsSymbol
equals :: forall l r o. Equals l r o => SProxy l -> SProxy r -> BProxy o
equals _ _ = BProxy


-- Mirror

class MirrorP (a :: Symbol) (mirror :: Symbol) | a -> mirror, mirror -> a

instance mirrorEmpty :: MirrorP "" ""
else
instance mirrorCons :: (Cons head tail sym, MirrorP tailMirror tail, MirrorP tail tailMirror, Append tailMirror head mirror) => MirrorP sym mirror

class Mirror (a :: Symbol) (mirror :: Symbol) | a -> mirror, mirror -> a

instance mirrorMirrorP :: (MirrorP a b, MirrorP b a) => Mirror a b

mirror :: a b. Mirror a b => SProxy a -> SProxy b
mirror _ = SProxy

-- Snoc

--| ```purescript
--| Snoc "symbo" "l" ?x ~~> ?x = "symbol"
--| Snoc ?a ?b "symbol" ~~> ?a = "symbo", ?b = "l"
--| ```
-- | `end` must be a single character
class Snoc (list :: Symbol) (end :: Symbol) (symbol :: Symbol) | end list -> symbol, symbol -> end list

instance snocMirror :: (Mirror sym mirror, Cons end listMirror mirror, Mirror listMirror list) => Snoc list end sym

--| ```purescript
--| snoc (SProxy :: SProxy "symbo") (SProxy :: SProxy "l") = SProxy :: SProxy "symbol"
--| ```
snoc :: a b c. Snoc a b c => SProxy a -> SProxy b -> SProxy c
snoc _ _ = SProxy

0 comments on commit e07bec7

Please sign in to comment.