# Rego Keyword Examples: some

The `some` keyword is used to define a local variable for use later in a rule. The keyword can also used in conjunction with the `in` keyword to enumerate a series of items in a list or key value pairs in an object.

## Examples

## Some and in with arrays

In this example, we use `some` to select each item in an array, perform a check on it, and return matching items as a new array. Processing lists of values like this is one of the most common use cases for `some`.

data.json

```
{}
```

input.json

```
{}
```

policy.rego

```
package playimport rego.v1example_array := [1, "example", 3]filtered_array := [e |	some e in example_array	is_number(e)]
```

## Some and in with objects

Similar to arrays, `some` can also be used on key->value pairs in objects. Here, we create two variables, one for the key and another for the value. The Rego rule is then evaluated for each pair.

We can use the key and value however we like. Here, we use the name of the permission to create a list of permissions that are toggled on in the `example_object`.

data.json

```
{}
```

input.json

```
{}
```

policy.rego

```
package playimport rego.v1example_object := {	"read": true,	"write": true,	"delete": false,	"create": false,}permission_list contains permission if {	some permission, value in example_object	value == true}
```

Some for arbitrary iteration

The `some` keyword can also be used to instantiate variables used in arbitrary iteration. This is best practice as it makes it easier for readers to see which variables are used in each rule.

In the example below, `some` is used to declare `i` and `j` to search over a 2D array of requests from the past week. This data is then used to enforce a rate limiting policy on the new request from a user in the `input`.

Click 'Open in Playground' below to see the full example data.

policy.rego

```
package playimport rego.v1limit_period := 3 # dayslimit_count := 4 # requestsrequests_in_period contains request if {	some i, j	i <= limit_period	request := data.last_weeks_requests[i][j]	request.user_id == input.user_id}default allow := falseallow if count(requests_in_period) <= limit_countmessage := sprintf(	"user_id %d made %d requests in %d days, limit is %d",	[input.user_id, count(requests_in_period), limit_period, limit_count],)
```

Output

{
  "allow": true,
  "limit\_count": 4,
  "limit\_period": 3,
  "message": "user\_id 1 made 4 requests in 3 days, limit is 4",
  "requests\_in\_period": \[
    {
      "request\_id": 403,
      "user\_id": 1
    },
    {
      "request\_id": 501,
      "user\_id": 1
    },
    {
      "request\_id": 602,
      "user\_id": 1
    },
    {
      "request\_id": 701,
      "user\_id": 1
    }
  \]
}

input.json

```
{  "request_id": 801,  "user_id": 1}
```

data.json

```
{  "last_weeks_requests": [    [      {        "user_id": 1,        "request_id": 701      },      {        "user_id": 2,        "request_id": 702      },      {        "user_id": 3,        "request_id": 703      }    ],    [      {        "user_id": 3,        "request_id": 601      },      {        "user_id": 1,        "request_id": 602      }    ],    [      {        "user_id": 1,        "request_id": 501      },      {        "user_id": 2,        "request_id": 502      },      {        "user_id": 3,        "request_id": 503      }    ],    [      {        "user_id": 2,        "request_id": 401      },      {        "user_id": 3,        "request_id": 402      },      {        "user_id": 1,        "request_id": 403      }    ],    [      {        "user_id": 1,        "request_id": 301      },      {        "user_id": 2,        "request_id": 302      },      {        "user_id": 1,        "request_id": 303      },      {        "user_id": 1,        "request_id": 304      }    ],    [      {        "user_id": 3,        "request_id": 201      },      {        "user_id": 1,        "request_id": 202      }    ],    [      {        "user_id": 1,        "request_id": 101      },      {        "user_id": 2,        "request_id": 102      },      {        "user_id": 1,        "request_id": 103      }    ]  ]}
```

[Open in OPA Playground](https://play.openpolicyagent.org/?state=eyJpIjoie1xuICBcInJlcXVlc3RfaWRcIjogODAxLFxuICBcInVzZXJfaWRcIjogMVxufSIsImQiOiJ7XG4gIFwibGFzdF93ZWVrc19yZXF1ZXN0c1wiOiBbXG4gICAgW1xuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMSxcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDcwMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDIsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiA3MDJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAzLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogNzAzXG4gICAgICB9XG4gICAgXSxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAzLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogNjAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMSxcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDYwMlxuICAgICAgfVxuICAgIF0sXG4gICAgW1xuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMSxcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDUwMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDIsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiA1MDJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAzLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogNTAzXG4gICAgICB9XG4gICAgXSxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAyLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogNDAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMyxcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDQwMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDEsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiA0MDNcbiAgICAgIH1cbiAgICBdLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDEsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiAzMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAyLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogMzAyXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMSxcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDMwM1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDEsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiAzMDRcbiAgICAgIH1cbiAgICBdLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDMsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiAyMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAxLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogMjAyXG4gICAgICB9XG4gICAgXSxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIFwidXNlcl9pZFwiOiAxLFxuICAgICAgICBcInJlcXVlc3RfaWRcIjogMTAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInVzZXJfaWRcIjogMixcbiAgICAgICAgXCJyZXF1ZXN0X2lkXCI6IDEwMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ1c2VyX2lkXCI6IDEsXG4gICAgICAgIFwicmVxdWVzdF9pZFwiOiAxMDNcbiAgICAgIH1cbiAgICBdXG4gIF1cbn0iLCJwIjoicGFja2FnZSBwbGF5XG5cbmltcG9ydCByZWdvLnYxXG5cbmxpbWl0X3BlcmlvZCA6PSAzICMgZGF5c1xuXG5saW1pdF9jb3VudCA6PSA0ICMgcmVxdWVzdHNcblxucmVxdWVzdHNfaW5fcGVyaW9kIGNvbnRhaW5zIHJlcXVlc3QgaWYge1xuXHRzb21lIGksIGpcblxuXHRpIDw9IGxpbWl0X3BlcmlvZFxuXG5cdHJlcXVlc3QgOj0gZGF0YS5sYXN0X3dlZWtzX3JlcXVlc3RzW2ldW2pdXG5cblx0cmVxdWVzdC51c2VyX2lkID09IGlucHV0LnVzZXJfaWRcbn1cblxuZGVmYXVsdCBhbGxvdyA6PSBmYWxzZVxuXG5hbGxvdyBpZiBjb3VudChyZXF1ZXN0c19pbl9wZXJpb2QpIDw9IGxpbWl0X2NvdW50XG5cbm1lc3NhZ2UgOj0gc3ByaW50Zihcblx0XCJ1c2VyX2lkICVkIG1hZGUgJWQgcmVxdWVzdHMgaW4gJWQgZGF5cywgbGltaXQgaXMgJWRcIixcblx0W2lucHV0LnVzZXJfaWQsIGNvdW50KHJlcXVlc3RzX2luX3BlcmlvZCksIGxpbWl0X3BlcmlvZCwgbGltaXRfY291bnRdLFxuKVxuIn0=)