fix repeat

This commit is contained in:
Folkert 2020-06-23 00:02:36 +02:00
parent 2a7bf2ae66
commit af33e26811
2 changed files with 21 additions and 28 deletions

View file

@ -57,8 +57,11 @@ impl IDStore {
} }
} }
fn shared() -> SolvedType { fn shared(base: SolvedType) -> SolvedType {
SolvedType::Boolean(SolvedAtom::Zero, vec![]) SolvedType::Apply(
Symbol::ATTR_ATTR,
vec![SolvedType::Boolean(SolvedAtom::Zero, vec![]), base],
)
} }
fn boolean(b: VarId) -> SolvedType { fn boolean(b: VarId) -> SolvedType {
@ -644,21 +647,23 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
) )
}); });
// To repeat an item, it must be shared!
//
// repeat : Attr * Int // repeat : Attr * Int
// , a // , Attr Shared a
// -> Attr * (List a) // -> Attr * (List (Attr Shared a))
add_type(Symbol::LIST_REPEAT, { add_type(Symbol::LIST_REPEAT, {
let a = tvar!(); let a = tvar!();
let star1 = tvar!(); let star1 = tvar!();
let star2 = tvar!(); let star2 = tvar!();
unique_function( unique_function(
vec![int_type(star1), flex(a)], vec![int_type(star1), shared(flex(a))],
SolvedType::Apply( SolvedType::Apply(
Symbol::ATTR_ATTR, Symbol::ATTR_ATTR,
vec![ vec![
boolean(star2), boolean(star2),
SolvedType::Apply(Symbol::LIST_LIST, vec![flex(a)]), SolvedType::Apply(Symbol::LIST_LIST, vec![shared(flex(a))]),
], ],
), ),
) )
@ -714,13 +719,7 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]), SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]),
], ],
), ),
SolvedType::Apply( shared(SolvedType::Func(vec![attr_type(u, a)], Box::new(flex(b)))),
Symbol::ATTR_ATTR,
vec![
shared(),
SolvedType::Func(vec![attr_type(u, a)], Box::new(flex(b))),
],
),
], ],
list_type(star2, b), list_type(star2, b),
) )
@ -744,13 +743,10 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]), SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]),
], ],
), ),
SolvedType::Apply( shared(SolvedType::Func(
Symbol::ATTR_ATTR, vec![attr_type(u, a), flex(b)],
vec![ Box::new(flex(b)),
shared(), )),
SolvedType::Func(vec![attr_type(u, a), flex(b)], Box::new(flex(b))),
],
),
flex(b), flex(b),
], ],
flex(b), flex(b),
@ -939,13 +935,10 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
SolvedType::Apply(Symbol::SET_SET, vec![attr_type(u, a)]), SolvedType::Apply(Symbol::SET_SET, vec![attr_type(u, a)]),
], ],
), ),
SolvedType::Apply( shared(SolvedType::Func(
Symbol::ATTR_ATTR, vec![attr_type(u, a), flex(b)],
vec![ Box::new(flex(b)),
shared(), )),
SolvedType::Func(vec![attr_type(u, a), flex(b)], Box::new(flex(b))),
],
),
flex(b), flex(b),
], ],
flex(b), flex(b),

View file

@ -2086,7 +2086,7 @@ mod test_uniq_solve {
fn list_repeat() { fn list_repeat() {
infer_eq( infer_eq(
indoc!("List.repeat"), indoc!("List.repeat"),
"Attr * (Attr * Int, a -> Attr * (List a))", "Attr * (Attr * Int, Attr Shared a -> Attr * (List (Attr Shared a)))",
); );
} }