<* (notFollowedBy $ char '(')
, try $ nullaryStar
- , spanned $ nakedbrak
+ , nakedbrak
, spanned $ parenfunc
]
where
parenfunc = TFunctor <$> parseFunctor
<*> parens (tlexpr `sepBy` symbolic ',')
- nakedbrak = TFunctor "tuple" <$> brackets (tlexpr `sepBy` symbolic ',')
+ nakedbrak = listify <$> spanned (brackets (tlexpr `sepBy` symbolic ','))
+ where
+ listify (xs :~ s) =
+ let (xs' :~ s') = foldr (\a@(_ :~ sa) b@(_ :~ sb) -> TFunctor "cons" [a,b] :~ (sa <> sb))
+ (TFunctor "nil" [] :~ r s)
+ xs
+ in (xs' :~ (s <> s'))
+ r (Span _ e b) = Span e e b
mkta ty te = TAnnot (AnnType ty) te
case_bracketTuple :: Assertion
case_bracketTuple = e @=? (term s)
where
- e = TFunctor "tuple"
+ e = TFunctor "cons"
[ _tNumeric (Left 1) :~ Span (Columns 1 1) (Columns 2 2) s
- , TFunctor "+"
- [ _tNumeric (Left 2) :~ Span (Columns 3 3) (Columns 4 4) s
- , _tNumeric (Left 3) :~ Span (Columns 5 5) (Columns 6 6) s
- ]
- :~ Span (Columns 3 3) (Columns 6 6) s
+ , TFunctor "cons"
+ [ TFunctor "+"
+ [ _tNumeric (Left 2) :~ Span (Columns 3 3) (Columns 4 4) s
+ , _tNumeric (Left 3) :~ Span (Columns 5 5) (Columns 6 6) s
+ ]
+ :~ Span (Columns 3 3) (Columns 6 6) s
+ , TFunctor "nil" [] :~ Span (Columns 7 7) (Columns 7 7) s
+ ]
+ :~ Span (Columns 3 3) (Columns 7 7) s
]
:~ Span (Columns 0 0) (Columns 7 7) s
s = "[1,2+3]"